2017-02-11 155 views
1

我有3代表工作具有下列名称和列:SQL JOIN没有返回值

*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 

键=用户名

说明:

  • 每个用户可在均为用户移动用户表 H不过,并非所有用户都在PanCards表中。这是 ,因为只有已分配卡的用户出现在 PanCards表中。在这种情况下Doe的用户id = 3沙利文与用户名= 4有一个卡,因此,他们出现在PanCards

问题:

  • 我想实现的是过滤掉 移动用户用户表移动接入相当于和他们UserTypeNumber等效于1NUsers表中但不存在于PanCards表中。

我至今是低于SQL查询

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) 

结果是一个空表

Userid MobileAccess 

但是我想要的是具有如下的结果返回:

Userid MobileAccess 
1   Yes   
2   Yes   

我如何解决这个问题,并得到正确的结果?

+1

您正在与PanCards进行INNER JOIN,这意味着该表中必须有一行。删除加入 –

回答

4

如果你想使用JOIN,然后用LEFT JOINPanCards,并检查是否有匹配:

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; 

我觉得你的查询将没有加入到PanCards工作。

+0

嗨戈登,非常感谢。它是exaclty我正在寻找,它的作品。 – Hamza

+0

@Hamza。 。 。很高兴我能帮上忙。虽然不确定为什么有人决定倒下。可能是同一个人低估了你的问题(这当然是不恰当的)。 –

+0

我不确定为什么他们投了票。但我已经接受了你的答案。再次感谢您 – 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

可能会完成这项工作,但比通常的LEFT加入空检查要复杂得多。我真的没有看到有任何理由这样做... – AFract