SQL Server-只存在于一个表中的两个表的结果

SQL Server-只存在于一个表中的两个表的结果,sql,sql-server,database,Sql,Sql Server,Database,我有两张桌子: Users Messages --------- --------- [ FirstName ] [ FirstName ] [ LastName ] [ LastName ] [ SSN ] [ SSN ] [ Message ] 我对Microsoft SQL有以下查询: SELECT t2.FirstName, t

我有两张桌子:

  Users             Messages
  ---------         ---------
[ FirstName ]     [ FirstName ]
[ LastName  ]     [ LastName  ]
[ SSN       ]     [ SSN       ]
                  [ Message   ]
我对Microsoft SQL有以下查询:

SELECT 
    t2.FirstName, 
    t2.LastName,
    t2.SSN 
FROM 
    [Messages] as t1
JOIN
    [User] as t2
ON
    t1.SSN = t2.SSN 
它给我的是两张表上都存在的结果。我需要做的是,如果用户表上不存在记录的SSN,则只从Messages表中提取记录。我知道还有第二步要做,但我想不出来

更新:实际上它仍然不起作用。我在数据库中绝对没有空值。所有记录都填充有数据。我需要的是Messages表中不存在于Users表中的所有记录

例如:

Users    [ 1 John     Smith   111-11-1111 ]
Users    [ 2 Jim      Tompson 999-99-9999 ]

Messages [ 1 John     Smith   111-11-1111 ]
Messages [ 2 Jim      Tompson 999-99-9999 ]
Messages [ 3 Angelina Jolie   888-88-8888 ]
结果将是:
  • 选择中的T1而不是T2。您想要的是来自消息而不是用户的记录。当我们得到我们的列表时,您需要的是数据,而不是空值:D
  • 连接需要是外部连接(返回消息中的所有记录,并且只返回用户中匹配的记录,因为表的顺序是消息-然后是用户,左连接将起作用。)
  • 最后,因为您知道T2.ssn在未找到匹配项时将为null,所以对其进行筛选。因此,只返回在用户中找不到SSN的消息

  • 选择中的T1而不是T2。您想要的是来自消息而不是用户的记录。当我们得到我们的列表时,您需要的是数据,而不是空值:D
  • 连接需要是外部连接(返回消息中的所有记录,并且只返回用户中匹配的记录,因为表的顺序是消息-然后是用户,左连接将起作用。)
  • 最后,因为您知道T2.ssn在未找到匹配项时将为null,所以对其进行筛选。因此,只返回在用户中找不到SSN的消息

试试这个:

SELECT 
t2.FirstName, 
t2.LastName,
t2.SSN 
FROM 
[Messages] t2
WHERE
t2.SSN
NOT IN
(
 SELECT DISTINCT
 SSN
 FROM
 [Users]
)
试试这个:

SELECT 
t2.FirstName, 
t2.LastName,
t2.SSN 
FROM 
[Messages] t2
WHERE
t2.SSN
NOT IN
(
 SELECT DISTINCT
 SSN
 FROM
 [Users]
)

使用左连接并添加
,其中t2.ssn为null
oh,您必须将t2选择更改为t1。与其复制社交,不如在Messages表中引用userID,然后在需要时在Users表上连接。纯粹从设计角度来看,ssn。这不是唯一的。它在死后几十年被重新使用。并非所有人都有SSN(这是美国构造)@mkross1983谢谢你的建议,我会记住它。@xQbert我理解你的观点,我知道SSN会被重用,但现在我更关心的是如何运行查询,稍后会担心验证。谢谢。使用左连接并添加
,其中t2.ssn为null
哦,您必须将t2选择更改为t1。与其复制社交,不如在Messages表中引用userID,然后在需要时在Users表上连接。纯粹从设计角度来看,ssn。这不是唯一的。它在死后几十年被重新使用。并非所有人都有SSN(这是美国构造)@mkross1983谢谢你的建议,我会记住它。@xQbert我理解你的观点,我知道SSN会被重用,但现在我更关心的是如何运行查询,稍后会担心验证。谢谢。此外,OP,您可能会发现本指南很有帮助,我知道我做了:nod这是我最喜欢的(如果不是最喜欢的)视觉辅助工具之一,当谈论SQL并将其作为集合处理/管理时。此外,OP,您可能会发现本指南很有帮助,我知道我做了:nod这是我最喜欢的(如果不是最喜欢的)视觉辅助工具之一讨论SQL并将其作为集合进行处理/管理时的可视化辅助工具。
SELECT 
t2.FirstName, 
t2.LastName,
t2.SSN 
FROM 
[Messages] t2
WHERE
t2.SSN
NOT IN
(
 SELECT DISTINCT
 SSN
 FROM
 [Users]
)
SELECT  *
FROM    messages m
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    users u
        WHERE   u.ssn = m.ssn
        )