两个表之间的比较

时间:2011-01-21 17:21:09

标签: sql sql-server tsql

我试图从一个表中提取一个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)

5 个答案:

答案 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)