sql - 从一个表中选择另一个表中不存在的记录

时间:2017-05-31 01:11:31

标签: sql sql-server

我正在尝试从表“俱乐部”中不存在的表“用户”中选择所有记录。但是,该句仍然显示在“俱乐部”表中存在的一些记录。

表:用户

ID, Name, Registration_Date
***************************
3, Mark, 5/1/2017
7, Paul, 5/2/2017
8, John, 5/3/2017

表:俱乐部

************
User_ID, Club_Name
  3, Chicago
  3, Texas
  7, Miami
  7, San Antonio

这是SQL句子:

SELECT 
    [Users].[ID], 
    [Users].[Name]
FROM 
    [Users]
LEFT JOIN 
    [Clubs]
ON 
    [Users].[ID] = [Clubs].[User_ID]  
WHERE
    [Clubs].[User_ID] IS NULL AND
    [Users].[Status] = 'Active' AND
    [Users].[Gender] = 'Female'
GROUP BY 
    [Users].[ID],
    [Users].[Name]
ORDER BY 
    [Users].[ID] DESC

这是我得到的结果

8, John
3, Mark

出于某种原因,ID 3的用户仍在显示,该用户存在于“俱乐部”表中。

非常感谢任何帮助。

6 个答案:

答案 0 :(得分:2)

它读起来像英语:从用户中选择User.Id不在俱乐部中。这是查询:

SELECT 
    [Users].[ID], 
    [Users].[Name]
FROM 
    [Users]
WHERE
    [Users].[Status] = 'Active' AND
    [Users].[Gender] = 'Female' AND 
    [Users].[ID] not in (select UserID from Clubs)
ORDER BY 
    [Users].[ID] DESC

有关IN operator的更多信息。

答案 1 :(得分:1)

这是詹姆斯提出的问题的解决方案:

  

检查两个表中是否有额外的空格(或类似的东西)用于" 3"记录,可能导致它无法正确匹配。我在本地重新创建了DB,查询对我有用。 -

问题是列状态中的空格。

我添加了此评论,因为正确的答案是作为评论提供的,并且没有找到任何其他选项来接受评论作为正确答案。

答案 2 :(得分:0)

试试这个

SELECT 
    [Users].[ID], 
    [Users].[Name]
FROM 
    [Users]
WHERE
    [Users].[ID] NOT IN (SELECT [Clubs].[User_ID] FROM [Clubs]) AND
    [Users].[Status] = 'Active' AND
    [Users].[Gender] = 'Female'
GROUP BY 
    [Users].[ID],
    [Users].[Name]
ORDER BY 
    [Users].[ID] DESC

答案 3 :(得分:0)

更新了查询

SELECT 
[Users].[ID], 
[Users].[Name]
FROM 
[Users]
WHERE
[Users].[ID] IN 
(SELECT [Users].[ID] except (SELECT UserId from Clubs group by Clubs.UserId)) 
AND
[Users].[Gender] = 'Female' AND
[Users].[Status] = 'Active' // other filters as necessary
ORDER BY 
[Users].[ID] DESC

可能需要执行执行计划,可能不是性能,但会为您提供必要的结果

答案 4 :(得分:0)

  SELECT [Users].[ID], [Users].[Name] 
  FROM [Users]  
  WHERE not exists(Select 1 from [Clubs] where [Clubs].[User_ID]=[Users].[ID]) 
  AND [Users].[Status] = 'Active' 
  AND [Users].[Gender] = 'Female' 
  GROUP BY [Users].[ID], [Users].[Name] 
  ORDER BY [Users].[ID] DESC

Club表中不存在用户ID,并且将提取Users表中的用户ID。

答案 5 :(得分:0)

我认为问题在于左连接。

改变这个: 从     [用户] LEFT JOIN     [俱乐部]

为此: 从     [用户] 正确的加入     [俱乐部]