2016-01-29 83 views
4

我有兩個表,t1和t2,具有相同的列(id,desc)和數據。但是其中一個列desc可能會爲同一個主鍵id創建不同的數據。使用where子句與聯盟

我想選擇從這兩表中的所有的那些行,使得t1.desc!= t2.desc

select a.id, b.desc 
FROM (SELECT * FROM t1 AS a 
     UNION ALL 
     SELECT * FROM t2 AS b) 
WHERE a.desc != b.desc 

例如,如果T1具有(1, 'AAA')和(2,」 bbb')和t2有(1,'aaa')和(2,'bbb1'),那麼新表應該有(2,'bbb')和(2,'bbb1')

但是,似乎沒有工作。請讓我知道我出錯的地方,正確的方法是什麼。

+0

什麼是您的關係型數據庫? –

+0

我的dbms是Oracle。 – Roshni

回答

2

UNION ALL轉儲後由查詢的第一部分所產生的行查詢的第二部分中的所有行。您無法將a的字段與b的字段進行比較,因爲它們屬於不同的行。

你可能試圖做的是找到t1的記錄與id s匹配這些t2,但不同的描述。與之搭配的t2記錄將結束在同一排連接的數據,讓你做的不平等描述的比較標識

SELECT a.id, b.desc 
FROM t1 AS a 
JOIN t2 AS b ON a.id = b.id 
WHERE a.desc != b.desc 

這樣記錄的t1:這可以通過一個JOIN來實現。

我想既要選擇的行爲的描述是不相等的

您可以使用組UNION ALL兩者之間通過獲得行的加入,與表切換的地方,這樣的:

SELECT a.id, b.desc -- t1 is a, t2 is b 
FROM t1 AS a 
JOIN t2 AS b ON a.id = b.id 
WHERE a.desc != b.desc 
    UNION ALL 
SELECT a.id, b.desc -- t1 is b, t2 is a 
FROM t2 AS a 
JOIN t1 AS b ON a.id = b.id 
WHERE a.desc != b.desc 
+0

感謝您的回答。但是如果描述不相同,我希望兩行都被選中。也就是說,新表應該包含t1和t2中描述不同的所有行。例如,如果t1具有(1,'aaa')和(2,'bbb')並且t2具有(1,'aaa')和(2,'bbb1'),那麼新表應該具有(2,'bbb ')和(2,'bbb1')。再次感謝。 – Roshni

+0

@Roshni請看看編輯。 – dasblinkenlight

+0

謝謝。我會嘗試。 – Roshni

4

Union不會比較data.You需要Join這裏

SELECT * 
FROM t1 AS a 
inner join t2 AS b 
on a.id =b.id 
and a.desc != b.desc 
1

UNION運算符用於組合兩個或更多SELECT語句的結果集。

請注意,UNION中的每個SELECT語句必須具有相同數量的列。這些列也必須具有相似的數據類型。

因此,如果它具有相同的列數和相同的數據類型,那麼使用union,否則僅可以使用。

SELECT * 
FROM t1 AS a 
inner join t2 AS b 
on a.id =b.id 
and a.desc != b.desc 
+0

請使用查詢代碼編輯您的問題,而不是圖片。如果你不知道如何格式化它,只需在代碼前後給出一個空行,並在每行之前給出4個空格或製表符。 –