我试图从一个表中提取一个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)
答案 0 :(得分:6)
不是很多更容易做到:
SELECT Table1.ID,
Table1.Name
FROM Table1
LEFT JOIN Table2 ON Table1.ID = Table2.ID
WHERE Table2.ID is null
答案 1 :(得分:1)
括号和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 EXISTS
而不是NOT IN
,但我认为ID
字段不太可能是空的?
答案 2 :(得分:0)
COLLATE
语句仅适用于表达式,而不适用于集合。你确定你实际上需要来指定一个整理吗?如果是这样,您需要将其移动到子选择内部,以便它以这种方式读取:
select Table2.ID COLLATE SQL_Latin1_General_CP1_CS_AS from Table2
答案 3 :(得分:0)
这部分......
((select (Table2.ID) from Table2) COLLATE SQL_Latin1_General_CP1_CS_AS)
似乎正在收集行列表...请尝试删除COLLATE SQL_Latin1_General_CP1_CS_AS
只需使用:
(select (Table2.ID) from Table2) )
答案 4 :(得分:0)
对不存在测试的最佳执行查询是...使用NOT-exists。
工作表不需要稍后使用WHERE子句将LEFT JOIN的所有行收集到PRUNE
。第一个存在匹配将中止table1行。
Select Table1.ID,
Table1.Name
From Table1
Where NOT EXISTS (SELECT *
from Table2
WHERE Table2.ID = TABLE1.ID)