I have 3 table A,B,C,D with the same columns and I'm trying to retrieve the
user_id that are in table a and b but not c.
For instance:
Table A
user_id closed acct
10102345 Yes
12456786 Yes
Table B
user_id closed acct
10102345 Yes
12456786 Yes
Table C
user_id closed acct
45345696 No
45698788 Yes
12456786 Yes
这是我尝试但执行时间很长的代码:SELECT user_id FROM TableA WHERE user_id NOT IN (SELECT DISTINCT user_id
FROM TableB) OR user_id NOT IN (SELECT DISTINCT ID FROM Table C)
或者
根据表中的行数和表
TableA
中TableB
的行数TableC
,您可以在 SQL Server/TSQL 中使用 EXCEPT 子句:版本 1 对应于您的第一条评论:
编辑:感谢评论中的@ypercube TM,相应的简化 SQL 查询:
有关 DISTINCT 子句,请参见1。
版本 2 对应 SQL 语句:
(这与您的第一句话的含义不同,此语句要求 TableA 中的 user_ids 在 TableB 和 TableC 中都不存在)
编辑:再次相应的简化 SQL 查询:
有关 DISTINCT 子句,请参见1。
如果您可以期待很少的行:
TableC
成比例TableA
TableB
TableB
+TableC
成比例地TableA
这种方式在性能方面非常有效,在资源方面也不会太昂贵。在这些情况下,我建议在其他 RDBMS(EXCEPT 或 MINUS 子句)上使用相同的方法,在适用时比 NOT IN / NOT EXISTS / LEFT JOIN .. WHERE NULL 要好得多。
在您的情况下,由于 user_id 显然是这 3 个表的 PK,因此我在 WITH 子句中选择 UNION ALL 与 UNION 以提高性能。由于我们无法猜测 user_id 是否可能
TableA
在TableB
(版本 1)/TableB
以及TableC
(版本 2)中,我们必须在 SELECT FROM USERS 中将它们区分为1 。因此,在 WITH 子句中对它们进行重复数据删除没有任何好处。编辑: 1正如评论中的@ypercube TM所述,DISTINCT 在版本 2 中没有用处,并且只有在有一些相同的 user_ids
TableA
并TableB
与UNION ALL连接时才会对版本 1 产生影响(不使用 DISTINCT 使用联盟)。DISTINCT 子句可以从查询中删除,我让它们在这里作为一种在模式/DDL 之上提供数据/DML 意识的方式。