शामिल होने के साथ डेटाबेस से शून्य प्रविष्टियां प्राप्त करें

मेरे पास फ़ील्ड के साथ उपस्थिति पर दो टेबल हैं

ID          UserID      isPresent InTime           OutTime          Date
----------- ----------- --------- ---------------- ---------------- -----------------------
1           1           p         10:00:00.0000000 18:00:00.0000000 2013-01-01 00:00:00.000
2           2           P         10:00:00.0000000 18:00:00.0000000 2013-01-02 00:00:00.000
3           2           p         10:00:00.0000000 18:00:00.0000000 2013-01-03 00:00:00.000

And a user table 

USerID      UserName
----------- ----------------------------------------------------------------------------------------------------
1           test
2           test1
3           test2
4           test3
5           test4
6           test5
7           test6

और मेरे पास सभी कर्मचारियों की उपस्थिति पाने के लिए एक प्रश्न है और यदि यह शून्य है तो अंतराल और आउटटाइम को शून्य के रूप में दिखाएं

मेरी पूछताछ है

SELECT u.ID as UserID, isPresent, day(Date) as day FROM users u
  join EmployeeAttendance e on e.USerID = u.ID 

  where [Date] between 'Jan  1 2013 12:00AM' and 'Jan 31 2013 11:59PM'

लेकिन यह क्वेरी केवल उन परिणामों को देती है जो उपस्थिति तालिका में हैं

UserID      isPresent day
----------- --------- -----------
1           p         1
2           P         2
2           p         3

लेकिन मुझे ज़रूरत है

    UserID      isPresent   day
    ----------- -------   -- -----------
    1           p         1
    2           P         2
    2           p         3
    3           NULL      Null
    4           NULL      Null
    5           NULL      Null
    6           NULL      Null
    7           NULL      Null

तो कोई विचार है कि मुझे यह कैसे प्राप्त करना चाहिए ..

धन्यवाद

2
कृपया टाइमस्टैम्प के साथ BETWEEN का उपयोग न करें , खासकर SQL सर्वर पर। इसके अलावा, मुझे आपकी उपस्थिति तालिका में समस्याएं हैं; क्या होता है यदि कोई अगला दिन (इसलिए, 1 पूर्वाह्न) को इंगित करता है? आप घड़ी-में और घड़ी-समय दोनों के लिए एक पूर्ण टाइमस्टैम्प संग्रहीत करना बेहतर होगा (और संभवतः वे बेहतर नाम हैं - यदि संभव हो तो आपको पहचानकर्ताओं के लिए आरक्षित शब्दों का उपयोग नहीं करना चाहिए)। आपको उपस्थिति तालिका id
जोड़ा लेखक Clockwork-Muse, स्रोत
join के बजाय बाएं बाहरी शामिल के बारे में कैसे?
जोड़ा लेखक Milen, स्रोत

3 उत्तर

बाएं जॉइन

SELECT u.ID as UserID, isPresent, day(Date) as day FROM users u
 LEFT join EmployeeAttendance e on e.USerID = u.ID 

  where [Date] between 'Jan  1 2013 12:00AM' and 'Jan 31 2013 11:59PM'
1
जोड़ा
यह परिणाम देता है जो कहां स्थित है ... लेकिन मुझे उन सभी उपयोगकर्ताओं के लिए शून्य प्रविष्टियों की आवश्यकता है यदि उनके लिए उपस्थिति मौजूद नहीं है
जोड़ा लेखक G.S Bhangal, स्रोत
SELECT u.id      AS UserID, 
       ispresent, 
       Day(date) AS day 
FROM   users u 
       LEFT JOIN employeeattendance e 
              ON e.userid = u.id 
WHERE  [date] BETWEEN 'Jan  1 2013 12:00AM' AND 'Jan 31 2013 11:59PM' 
1
जोड़ा
लेकिन यह अभी भी वही परिणाम देता है ... मुझे शून्य और आउट समय के साथ कोई रिकॉर्ड नहीं मिल रहा है
जोड़ा लेखक G.S Bhangal, स्रोत
बहुत बहुत धन्यवाद ... यह वही है जो मुझे चाहिए
जोड़ा लेखक G.S Bhangal, स्रोत
कोशिश करें -> उपयोगकर्ता आईडी के रूप में u.ID चुनें, वर्तमान में दिन (दिनांक) उपयोगकर्ताओं के बीच में शामिल हों (चयन करें * कर्मचारी से [जहां] '1 जनवरी 2013 12:00 पूर्वाह्न' और '31 जनवरी 2013 11:59 अपराह्न' के बीच [दिनांक] ) e.USerID = u.ID पर ई
जोड़ा लेखक mameyugo, स्रोत
या यह -> उपयोगकर्ता आईडी के रूप में u.ID को चुनें, वर्तमान, दिन (दिनांक) दिन के रूप में उपयोगकर्ताओं द्वारा कर्मचारियों में शामिल होने के लिए e.USerID = u.ID और [दिनांक] '1 जनवरी 2013 12:00 पूर्वाह्न' और 'जनवरी' के बीच 31 2013 11:59 अपराह्न '
जोड़ा लेखक mameyugo, स्रोत

शामिल होने के बजाय सही बाहरी शामिल हों

1
जोड़ा
प्रत्येक जवाब के मुताबिक ओपी को बाहरी संयुक्त का उपयोग करना चाहिए, मैं कहूंगा कि यह एक वैध जवाब है भले ही यह सही न हो। मैं नहीं देखता कि इसे आलोचना कैसे माना जा सकता है
जोड़ा लेखक Panagiotis Kanavos, स्रोत
यह बाएं शामिल होना चाहिए दाएं शामिल होना चाहिए।
जोड़ा लेखक Ashish Gaur, स्रोत