Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL联接不返回任何值_Sql_Sql Server_Sql Server 2008_Sql Server 2012 - Fatal编程技术网

SQL联接不返回任何值

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* *

我正在使用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*
**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'