SQL帮助:根据两列中的值在一个表中查找第二个表中不存在的行

Ton*_*ich 4 sql t-sql

我有两张桌子.我试图在一个表中找到基于两列中的值在第二个表中不存在的行.(我已将表简化为仅包含两列).两个表之间没有主键/外键.看起来很简单,但我现在有脑袋!

DDL:
CREATE TABLE [dbo].[Table_1](
    [firstname] [nchar](10) NULL,
    [lastname] [nchar](10) NULL
) 

CREATE TABLE [dbo].[Table_2](
    [firstname] [nchar](10) NULL,
    [lastname] [nchar](10) NULL
) 
Run Code Online (Sandbox Code Playgroud)

- 创建样本数据

INSERT INTO [dbo].[Table_1]([firstname], [lastname])
SELECT N'John      ', N'Doe       ' UNION ALL
SELECT N'John      ', N'Smith     '
INSERT INTO [dbo].[Table_2]([firstname], [lastname])
SELECT N'John      ', N'Doe       '
Run Code Online (Sandbox Code Playgroud)

- 我尝试失败了.我期待约翰史密斯回来

SELECT t.* FROM Table_1 AS t
WHERE NOT EXISTS
(SELECT t2.* FROM Table_2 AS t2
WHERE t.firstname <> t2.firstname
AND t.lastname <> t2.lastname)

SELECT * FROM Table_1 AS t
JOIN Table_2 AS t2
ON t.firstname <> t2.firstname
AND t.lastname <> t2.lastname
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 9

这个怎么样:

SELECT * 
FROM Table_1 AS t1
LEFT OUTER JOIN Table_2 AS t2
ON t1.firstname = t2.firstname
AND t1.lastname = t2.lastname
WHERE t2.firstname IS NULL AND t2.lastname IS NULL
Run Code Online (Sandbox Code Playgroud)

就我而言,我只得到约翰史密斯.

您基本上在公共字段的表之间执行外连接 - 在这两种情况下存在的那些行将具有两个t1和的值t2.

仅存在的那些行将t1不具有第二个表的任何值t2.