【问题标题】:Compare two tables via the three tables SQL通过三表SQL比较两表
【发布时间】:2021-08-05 19:14:20
【问题描述】:

我打算通过三个表比较两个表。我的查询如下

Select count(*)
from tableA a
join tableB b
on a.A_ID =b.A_ID
full join tableC c
on c.B_ID=b.B_ID
where a.A_ID is null or c.B_ID is null 

如果count为zore,则tableA和TableC匹配,否则,这两个表不匹配

运行查询需要很长时间。我们有办法快速比较 tableA 和 tableC 吗?

问题:如何比较tableA和tableC?

【问题讨论】:

  • 不清楚你想做什么——你能描述一下你的预期输出吗?
  • 定义“很长一段时间”。发布查询计划
  • 是否作为两个以 B 结尾的左连接的并集?
  • 如果tableA匹配tableC,期望输出应该为零
  • where a.A_ID is null 您的查询内部在此列上将 A 连接到 B,因此此过滤器永远不会为真。不明白为什么要使用完全联接来计算 - 我怀疑您有一个 XY problem 。您的示例数据可能会产生误导,因为您的表包含一组一致的值 - 您不会“看到”任何外部连接的效果。

标签: sql sql-server tsql


【解决方案1】:

这里不需要FULL JOIN,你可以加入前两个表,然后EXCEPT第三个。

SELECT COUNT(*)
FROM (
    SELECT b.B_ID, a.A_Name
    FROM tableA a
    JOIN tableB b ON a.A_ID = b.A_ID
    EXCEPT
    SELECT c.B_ID, c.B_Name
    FROM tableC c
) t;

注意EXCEPT 隐含DISTINCT 所以如果你想要table_A 中的额外行数那么你需要使用WHERE NOT EXISTS

SELECT b.B_ID, a.A_Name
FROM tableA a
JOIN tableB b ON a.A_ID = b.A_ID
WHERE NOT EXISTS (SELECT 1
    FROM tableC c
    WHERE c.B_ID = b.B_ID AND c.B_Name = a.A_Name
);

【讨论】:

    【解决方案2】:

    如果您想查找在一个表中但不在另一个表中的行,您可以在标准 SQL 中使用 EXCEPT 联合

    -- Show in A not in B
    SELECT * FROM TableA EXCEPT SELECT * FROM TableB
    
    -- Show in A not in C
    SELECT * FROM TableA EXCEPT SELECT * FROM TableC
    
    -- Show in B not in A
    SELECT * FROM TableB EXCEPT SELECT * FROM TableA
    
    -- Show in B not in C
    SELECT * FROM TableB EXCEPT SELECT * FROM TableC
    
    -- Show in C not in A
    SELECT * FROM TableC EXCEPT SELECT * FROM TableA
    
    -- Show in C not in B
    SELECT * FROM TableC EXCEPT SELECT * FROM TableB
    

    【讨论】:

    • 嗨 Hogan,我只想比较 tableA 和 TableC。 TableB是tableA和tableC的连接条件
    • 所以通过比较,您想查看 A 中的哪些记录但无法通过 B 连接到 C 中的任何记录,并查看 C 中的哪些记录没有与它们连接的任何记录?跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多