SQL Server - 从其他表中排除记录

Posted

技术标签:

【中文标题】SQL Server - 从其他表中排除记录【英文标题】:SQL Server - Exclude Records from other tables 【发布时间】:2018-01-23 16:00:20 【问题描述】:

我使用了搜索功能,找到了以下解决方案。

起点如下:我有一个存储所有数据的表 A。 我从该表中选择一定数量的记录并将其存储在表 B 中。

在一个新语句中,我想从表 A 中选择未出现在表 B 中的新记录并将它们存储在表 c 中。我试图用 AND ... NOT IN 语句解决这个问题。 但我仍然收到表 B 中的表 C 中的记录。

重要提示:我只能使用 select 语句,每个语句也需要以 select 开头。 有没有人知道以下语句中的问题可能出在哪里:

Select *
From
(Select TOP 10000 * 
FROM [table_A]
WHERE Email like '%@domain_A%' 
AND Id NOT IN (SELECT Id
FROM [table_B])) 
Union
(Select TOP 7500 * 
FROM table_A] 
WHERE Email like '%@domain_B%'
AND Id NOT IN (SELECT Id
FROM [table_B]))
Union
(SELECT TOP 5000 * 
FROM [table_A] 
WHERE Email like '%@domain_C%'  
AND Id NOT IN (SELECT Id
FROM [table_B]))

【问题讨论】:

您使用的是select top,没有 1order by`。每次运行查询时,您可能会得到一组不同的记录。 【参考方案1】:

尝试NOT EXISTS 而不是NOT IN

SELECT
*
FROM TableA A
  WHERE NOT EXISTS
  (
     SELECT 1 FROM TableB WHERE Id = A.Id
  )

【讨论】:

我尝试了 NOT EXIST,但是当我想用更多表格扩展它时收到错误消息。所以最后不仅会有table_B和table_C,还有Table_D、table_E、table_F……等等 你能告诉我你得到的错误信息是什么吗?【参考方案2】:

所以基本上这里的想法是从表A中选择表B中不存在的所有内容并将所有内容插入表C中?

    INSERT INTO Table_C 
    SELECT a.colum1, a.column2,......
    FROM [table_A]
    LEFT JOIN [table_B] ON a.id = b.ID
    WHERE a.Email like '%@domain_A%' AND b.id IS NULL

【讨论】:

EXCEPT 可能更简单更快? EXCEPT 未优化为像连接一样执行。除了将所有内容放入临时表然后删除另一个临时表中存在的所有内容之外,正确编写的连接会更有效。 很遗憾,我只能在语句开头使用 SELECT。 只排除插入行,该查询将给出表 A 中存在而表 B 中不存在的所有内容。 @Markov - 你的业绩声明有什么参考资料吗?由于 TableB 是 TableA 的子集,EXCEPT 是一种合乎逻辑的方法。请参阅以下内容并比较执行计划...sqlfiddle.com/#!18/fe44e/3 不同(在一个公认的小) 集是EXCEPT 计划不需要过滤器,因为优化器已经知道它是LEFT ANTI SEMI JOIN 而不是需要执行 LEFT JOINFILTER 来获得相同的结果。【参考方案3】:

感谢大家的反馈,我从中学到了很多。 在您的帮助下,我能够修正该声明。上面是现在正在使用所需结果的语句:

Select Id
From
(Select TOP 10000 * FROM Table_A
WHERE Email like '%@domain_a%'
AND Id NOT IN (SELECT Id
FROM Table_B)
order by No desc) t1
Union
Select Id
From
(Select TOP 7500 * FROM Table_A
WHERE Email like '%@domain_b%'
AND Id NOT IN (SELECT Id
FROM Table_B)
order by No desc) t2
Union
Select Id
From
(SELECT TOP 5000 * FROM Table_A
WHERE Email like '%@domain_c%'  
AND Id NOT IN (SELECT Id
FROM Table_B)
order by No desc) t3

【讨论】:

以上是关于SQL Server - 从其他表中排除记录的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQL Server CE 表中删除一行?

SQL Server:根据来自其他 2 个表的子查询从表中选择

SQL Server:从同一个表和不同表中获取日期时使用其他东西而不是联合

SQL 从其他表中给定时间戳后的记录中选择

SQL Server - 如果两个特定字段都为空,则从视图中排除记录

sql 2008 查询排除 某一列的数据