具有相同结构的表之间的差异

时间:2012-07-26 15:14:39

标签: sql teradata

我有两个具有相同结构且行略有不同的表 - 表A和表B. 我想提取表A中包含但表B中没有的所有行。 你能帮帮我吗?

顺便说一下 - 表A是定义形式,以前没有创建。

另外 - 我有15个sql脚本要分析。 我想找到一些软件可以帮助我实现整个过程的可视化(由15个sql脚本组成)。 你能提出一些好的建议吗?

4 个答案:

答案 0 :(得分:7)

SELECT * FROM Table_A
EXCEPT
SELECT * FROM Table_B

请参阅http://en.wikipedia.org/wiki/Set_operations_%28SQL%29#EXCEPT_operator

答案 1 :(得分:1)

我经常遇到同样的问题所以我编写了自己的软件,可以有效地处理大型数据库(数十列,数万行)。我想你已经解决了你的问题,但如果其他人面临同样的问题,我会在这里发帖。

软件在R中,可以查询并保存到MySQL服务器。要测试它虽然可能更容易将基数导出到两个csv文件,因为配置MySQL链接(通过RMySQL)可能需要一些时间。在gitHub上查看。

我们在团队中定期使用它并对此感到满意。

答案 2 :(得分:0)

手动编写查询的痛苦,因此有些工具(如RedGate's SQL Compare)可以为您完成。但...

SELECT
    A.*
   ,B.*
FROM
   A LEFT OUTER JOIN B
       ON A.Field1 = B.Field1
       AND A.Field2 = B.Field2
       ...   -- join on each field
WHERE
   B.Field1 IS NULL OR
   B.Field2 IS NULL OR 
   ...  -- check for any NULL fields in B

如果您对所有数据差异和仅有关键差异不感兴趣,那么只需更改您加入的字段列表并过滤到关键字段。

答案 3 :(得分:0)

一种方法是使用左外连接,这将在第一个表中选择all,然后在第二个表中匹配这些连接。如果来自第二个表的额外列为NULL,则第二个表中没有匹配的记录。

假设列a到c在两个表中都是唯一的

select a.*
  from tableA a
  left outer join tableB on a.a = b.a and ... a.c = b.c
  where b.a is null and ... and b.c is null