2012-09-21 44 views
1

我想比较具有相同列但行数不同的两个表。我如何查找哪些行对每个表唯一?我找到了一些连接教程,但它需要主键来连接两个表,我的示例表彼此没有关系。获取两个表的唯一行

样品表:

TableA 
Id | Name 
1 | Person1 
2 | Person2 
3 | Person3 
4 | Person4 

TableB 
Id | Name 
1 | Person1 
2 | Person2 
4 | Person4 

Sample result: 
Id | Name 
3 | Person3 

Optional result: 
Id | Name | Table 
3 | Person3 | TableA 
+0

看到你的评论的地方,你曾提到,这两个表之间没有任何关系,只要在ON子句中,您必须检查所有列的值到其他表中。请参阅下面的答案。 –

回答

2

此查询选择从表A中不存在TableB中加上从表B中的行不存在于表A,使用UNION语句行。

SELECT Id, Name, 'TableA' FROM TableA 
WHERE (Id, Name) NOT IN 
(SELECT Id, Name FROM TableB) 
UNION 
SELECT Id, Name, 'TableB' FROM TableB 
WHERE (Id, Name) NOT IN 
(SELECT Id, Name FROM TableA) 
+0

通常最好在代码中添加一些解释,告诉问题的人为什么会起作用,链接到文档等。还有助于您的代码不被低质量的后审查系统标记。请参阅@ JohnWoo关于如何操作的答案。 –

+0

完美!非常感谢Mariano! – Blackator

+0

@CraigRinger我不能使用John Woo的查询,因为它需要两个表的realtionship – Blackator

3

由于MySQL的缺乏FULL JOIN,您可以使用LEFT or RIGHT加入与UNION仍然模拟它。尝试,

SELECT a.* , 'TableA' as `Table` 
FROM tableA a 
     LEFT JOIN tableB b 
      ON a.id = b.id AND 
       a.name = b.name 
WHERE b.id IS NULL 
UNION 
SELECT d.*, 'TableB' as `Table` 
FROM tableA c 
     RIGHT JOIN tableB d 
      ON c.id = d.id AND 
       c.name = d.name 
WHERE c.id IS NULL 

SQLFiddle Demo

+0

@Blackator试试这个答案,我在表上添加了一些行。 –

0
SELECT COLUMN_NAME 
FROM information_schema.columns 
Where table_name="table_1" AND 
COLUMN_NAME NOT IN (
SELECT COLUMN_NAME 
FROM information_schema.columns 
WHERE table_name="table_2") 

我们从第一台用的(子查询)中不具有在第二相同的列(字段)的条件下获得的列名。因此,这给了我们那些第一张桌子独一无二的领域,正如您在您的问题中所希望的那样。

+0

通常最好在代码中添加一些解释,告诉问题的人为什么会起作用,链接到文档等。还有助于您的代码不会被低质量的后审查系统标记。请参阅@ JohnWoo关于如何操作的答案。 –

0

您可以使用简单的查询作为

SELECT * FROM表A,tableB的地方tableA.Name不是在tableB.Name而tableB.Name不是在tableA.Name