2017-02-11 3 views
1

I mit 3 Tabellen mit den folgenden Namen und Spalten arbeite:SQL JOIN keine Werte zurückkehrend

*Table 1* 
**Users** 
UserID UserName  UserTypeNumber 
1   John   1N 
2   Mary   1N 
3   Doe   1N 
4   Sullivan  2N 
5   Sally   1N 
**Key = UserID** 

*Table 2* 
**MobileUsers** 
Userid MobileAccess 
1   Yes   
2   Yes   
3   Yes   
4   Yes 
5   No 
**Key = UserID** 



*Table 3* 
**PanCards** 
UserID CARD_NUMBER      
3   2222   
4   3333 
5   1111 

Key = UserID

Erläuterung:

  • Jeder Benutzer verfügbar ist in beide Benutzer und MobileUsers Tabelle H Allerdings sind nicht alle Benutzer in PanCards Tabelle vorhanden. Dies ist , da nur Benutzer, denen eine Karte zugewiesen wurde, in der PanCards Tabelle angezeigt werden. In diesem Fall Doe mit UserID = 3 und Sullivan mit UserID = 4 eine Karte haben, daher erscheinen sie in PanCards Tabelle

Problem:

  • Was will ich erreichen ist zum Ausfiltern der Benutzer von MobileUsers Tabelle, die haben MobileAccess entspricht Ja und thier UserTypeNumber entspricht 1N im Benutzer Tabelle, aber sind nicht in der PanCards Tabelle vorhanden.

Was ich bisher habe, ist die unten SQL Query:

SELECT MobileUsers.Userid, MobileUsers.MobileAccess 
FROM MobileUsers 
INNER JOIN Users 
ON MobileUsers.Userid = Users.UserID 
INNER JOIN PanCards 
ON Users.UserID = PanCards.UserID 
WHERE MobileUsers.MobileAccess = 'Yes' 
AND 
Users.UserTypeID = '1N' 
AND 
MobileUsers.Userid NOT IN 
(SELECT PanCards.UserID FROM PanCards) 

Ergebnis eine leere Tabelle

Userid MobileAccess 

Allerdings ist das, was ich will, ist das unten Ergebnis haben zurückgegeben:

Userid MobileAccess 
1   Yes   
2   Yes   

Wie kann ich das beheben und die richtigen Ergebnisse erhalten?

+1

Sie machen einen INNEREN JOIN mit PanCards, das bedeutet, es muss eine Zeile in dieser Tabelle sein. Entfernen Sie diese Verbindung –

Antwort

4

Wenn Sie JOIN verwenden, dann eine LEFT JOIN für PanCards verwenden und prüfen, ob keine Treffer:

SELECT mu.* 
FROM MobileUsers mu JOIN 
    Users u 
    ON mu.Userid = u.UserID LEFT JOIN 
    PanCards pc 
    ON pc.UserID = mu.UserID 
WHERE mu.MobileAccess = 'Yes' AND 
     u.UserTypeID = '1N' AND 
     pc.UserID IS NULL; 

Ich denke, Ihre Anfrage an PanCards ohne beitreten funktionieren würde.

+0

Hallo Gordon, vielen Dank. Es ist genau das, wonach ich suche, es funktioniert. – Hamza

+0

@ Hamza. . . Froh, dass ich helfen konnte. Ich bin mir nicht sicher, warum jemand entschieden hat, das Gespräch abzubrechen. Wahrscheinlich dieselbe Person, die Ihre Frage abgelehnt hat (was sicherlich nicht angemessen ist). –

+0

Bin mir nicht sicher, warum sie auch nicht gewählt haben. Aber ich habe deine Antwort akzeptiert.Vielen Dank noch einmal – Hamza

1
WITH NotPan -- First get users that are not in the PanCards table 
AS 
(
select * from Users as u 
where u.userid not in (select userid from PanCards) 
) 
-- Easy from here 
select * from NotPan as n 
inner join mobileUsers m on m.userid = n.userid 
inner join Users as u on n.userid = u.userid 
WHERE m.MobileAccess = 'Yes' and u.UserTypeNumber = '1N' 
+0

Wird wahrscheinlich den Job erledigen, aber viel komplexer als eine normale LINKE Join mit Null-Check. Ich sehe wirklich keinen Grund, dies so zu machen ... – AFract