2012-09-21 70 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

相關問題