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

时间:2014-06-19 17:29:20

标签: sql sql-server database

我有两张桌子:

  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 

它给我的是两个表中存在的结果。我需要做的只是从Messages表中提取记录,如果他们的SSN在Users表中不存在。我知道有第二步涉及但无法弄清楚。

更新:实际上它仍然不起作用。我在数据库中绝对没有NULL。所有记录都填充了数据。我需要的是来自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 ]

结果将是:

         [ 3 Angelina Jolie   888-88-8888 ]       

3 个答案:

答案 0 :(得分:2)

    选择中
  • T1而不是T2。您希望消息中的记录不是用户。当我们得到我们的列表时,你想要数据,而不是空值:D
  • 加入需要成为外部联接(从邮件中返回所有记录,只返回匹配的用户中的记录,因为表的顺序是消息,然后是用户,左连接将起作用。)
  • 最后,因为您知道当找不到匹配项时T2.ssn将为null,请对其进行过滤。因此,仅返回在用户中找不到SSN的消息。

SELECT 
    t1.FirstName, 
    t1.LastName,
    t1.SSN 
FROM 
    [Messages] as t1
LEFT JOIN
    [User] as t2
ON
    t1.SSN = t2.SSN 
WHERE
T2.ssn is null

答案 1 :(得分:2)

SELECT  *
FROM    messages m
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    users u
        WHERE   u.ssn = m.ssn
        )

答案 2 :(得分:1)

试试这个:

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