SQL联接不返回任何值
我正在使用3个具有以下名称和列的表:SQL联接不返回任何值,sql,sql-server,sql-server-2008,sql-server-2012,Sql,Sql Server,Sql Server 2008,Sql Server 2012,我正在使用3个具有以下名称和列的表: *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* *
*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
说明:
每个用户都可以在Users和MobileUsers表中找到
然而,并非所有用户都出现在PanCards表中。这是
因为只有已分配卡的用户才会显示在
煎饼桌。在这种情况下,UserID=3的Doe和UserID=4的Sullivan有一张卡,因此它们出现在PanCards表中
问题:
我想要实现的是从中过滤出用户
MobileUsers表中的MobileAccess等效于Yes,其UserTypeNumber等效于用户表中的1N,但在PanCards表中不存在。
到目前为止,我得到的是以下SQL查询:
结果是一个空表
Userid MobileAccess
但是,我希望返回以下结果:
Userid MobileAccess
1 Yes
2 Yes
如何解决此问题并获得正确的结果?如果要使用联接,请使用Pancard的左联接并检查是否没有匹配项:
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的情况下工作。如果要使用连接,请使用PanCards的左连接并检查是否没有匹配项:
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连接的情况下可以工作。您正在对PanCards进行内部连接,这意味着该表中必须有一行。移除该连接您正在与PanCards进行内部连接,这意味着该表中必须有一行。把那根绳子拿开高登,谢谢你。这正是我想要的,它很有效。@Hamza。很高兴我能帮忙。但不确定为什么有人决定否决投票。可能是同一个人否决了你的问题,这肯定是不合适的。我也不知道他们为什么否决你的问题。但我已经接受了你的回答。再次谢谢你,戈登,非常感谢。这正是我想要的,它很有效。@Hamza。很高兴我能帮忙。但不确定为什么有人决定否决投票。可能是同一个人否决了你的问题,这肯定是不合适的。我也不知道他们为什么否决你的问题。但我已经接受了你的回答。再次感谢您,我们可能会完成这项工作,但要比使用空检查的常规左连接复杂得多。我真的看不出有任何理由这样做…可能会完成这项工作,但比使用null检查的常规左连接复杂得多。我真的不认为有任何理由这样做。。。
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'