【发布时间】:2010-01-22 19:11:01
【问题描述】:
我有两张桌子。我试图根据两列中的值在一个表中查找第二个表中不存在的行。 (我已将表格简化为仅包含两列)。两个表之间没有主键/外键。看起来很简单,但我现在脑子有问题!
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
)
-- 创建样本数据
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 '
--我的失败尝试。我期待约翰史密斯回来
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
【问题讨论】:
-
请说您并没有真正使用 nchar 数据类型作为名称。同样,如果没有任何其他识别信息,您怎么知道 table1 中的 John Smith 与 table2 中的 John Smith 相同?名称不是唯一的,您不应该计划它们是唯一的。虽然下面的查询可能会为您提供预期的结果,但它们可能不会给出正确的结果。
-
这只是我快速鞭打的一个例子。是的,它应该是 nvarchar,即使名称相同,人也是独一无二的。