SQL Server语言 - 结果从两个表只存在于一个



我有两个表:

  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不存在于用户表。我知道还有第二步可走,但我想不出来。

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

的例子:

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 ]       

SELECT  *
FROM    messages m
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    users u
        WHERE   u.ssn = m.ssn
        )
  • T1代替T2在选择。您需要来自消息的记录,而不是来自用户的记录。当我们得到列表时,你想要的是数据,而不是空值:D
  • Join需要是一个外部连接(返回消息中的所有记录,并且只有那些在用户中匹配的记录,因为表的顺序是消息然后是用户,左连接将工作)
  • 最后,既然你知道T2。当没有找到匹配项时,SSN将为空,对其进行过滤。因此,只返回在用户中找不到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

试试这个:

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

相关内容

最新更新