[英]Comparison between two tables
我试图从一个表中提取一个ID号和名称,以检查另一个表中是否不存在相同的ID号。 我收到错误消息:
子查询返回的值超过1。
以下是我的查询。
Select Table1.ID,
Table1.Name
From Table1
Where Table1.ID not in ((select (Table2.ID)
from Table2 )
COLLATE SQL_Latin1_General_CP1_CS_AS)
这岂不是更容易很多事情要做:
SELECT Table1.ID,
Table1.Name
FROM Table1
LEFT JOIN Table2 ON Table1.ID = Table2.ID
WHERE Table2.ID is null
不需要括号和collate
,或者collate
它们放在错误的位置,但是我无法得到与您得到的相同的错误。
with Table1(ID, Name) aS
(
SELECT 'A1',2 union all
select 'B1',2
),
Table2(ID, Name) aS
(
SELECT 'A1',2 union all
select 'D1',2
)
Select Table1.ID,
Table1.Name
From Table1
Where Table1.ID not in (select Table2.ID COLLATE SQL_Latin1_General_CP1_CS_AS
from Table2 )
工作正常。 与空值列上的NOT IN
,您应该更喜欢NOT EXISTS
,但我认为ID
字段不太可能为NULLABLE?
COLLATE
语句仅适用于表达式,不适用于集合。 您确定您确实需要在此处指定排序规则吗? 如果是这样,则需要将其移动到子选择内部,以便其读取方式如下:
select Table2.ID COLLATE SQL_Latin1_General_CP1_CS_AS from Table2
这部分...
((select (Table2.ID) from Table2) COLLATE SQL_Latin1_General_CP1_CS_AS)
似乎正在收集行列表...尝试删除COLLATE SQL_Latin1_General_CP1_CS_AS
并使用:
(select (Table2.ID) from Table2) )
对于不存在测试,性能最好的查询是...使用不存在。 该工作表不需要收集LEFT JOIN的所有行,而只是稍后使用WHERE子句收集到PRUNE
。 第一个存在匹配项将中止table1行。
Select Table1.ID,
Table1.Name
From Table1
Where NOT EXISTS (SELECT *
from Table2
WHERE Table2.ID = TABLE1.ID)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.