【问题标题】:SQL JOIN Returning no valuesSQL JOIN 不返回任何值
【发布时间】:2017-02-11 14:04:43
【问题描述】:

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

密钥 = 用户 ID

解释:

  • UsersMobileUsers 表中的每个用户都可用 但是,并非所有用户都出现在 PanCards 表中。这是 因为只有分配了卡片的用户才会出现在 PanCards 表。在这种情况下,UserID=3 的 Doe 和 UserID=4 的 Sullivan 有一张卡片,因此它们出现在 PanCards 表中

问题:

  • 我想要实现的是过滤掉用户 MobileUsers 表的 MobileAccess 等效于 Yes 并且其 UserTypeNumber 等效于 1N Users 表,但不存在于 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        

请问我该如何解决这个问题并获得正确的结果?

【问题讨论】:

  • 您正在使用 PanCards 进行 INNER JOIN,这意味着该表中必须有一行。删除该连接

标签: sql sql-server sql-server-2008 sql-server-2012


【解决方案1】:

如果您想使用JOIN,则使用LEFT JOIN 代替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 的情况下工作。

【讨论】:

  • 嗨,戈登,非常感谢。这正是我正在寻找的东西,它有效。
  • @Hamza 。 . .很高兴我能帮上忙。不过,不确定为什么有人决定投反对票。可能是对您的问题投反对票的同一个人(这当然不合适)。
  • 我也不确定他们为什么投了反对票。但我接受了你的回答。再次感谢您
【解决方案2】:
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'

【讨论】:

  • 可能会完成这项工作,但比带有空检查的常规 LEFT 连接要复杂得多。我真的没有任何理由这样做......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 2015-07-23
  • 1970-01-01
  • 2018-08-04
  • 2018-06-27
  • 1970-01-01
  • 2021-06-14
相关资源
最近更新 更多