繁体   English   中英

两张桌子之间的比较

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM