2014-10-08 207 views
0

我在同一張表上有兩個查詢,我需要得到的結果沒有出現在第一個結果集中。UNION是否覆蓋以前的結果?'

有幾種方法可以到那裏(我不問了一個),我第一次嘗試是這樣的:

SELECT * FROM 
(
    SELECT 
     o.custom_order_id AS 'order', 
     'yes'  AS 'test' 
    FROM orders 
    WHERE <first criteria> 

    UNION 

    SELECT 
     o.custom_order_id AS 'order', 
     'no'  AS 'test' 
    FROM orders 
    WHERE <second criteria> 
) x 
WHERE x.test = 'no' 

UNION不追加其已經出現在第一個結果集行。

其實我得到像

12345 no 

行,但(UNION前查詢)12345會出現在第一個結果集。

爲什麼?

編輯:

custom_order_id沒有索引,而不是主鍵(雖然它實際上是唯一的) - 不UNION需要一個(唯一)的索引或峯承認,連續被評爲已經在一-resultset

+2

'UNION'將返回唯一的**行**。 「12345是」和「12345否」是**兩個唯一行**。在你的例子中,如果你刪除'test'字段,你會得到你想要的。 – 2014-10-08 10:12:22

+1

@AdrianoRepetti這正是我的錯誤。 – DanFromGermany 2014-10-08 10:16:35

+0

有人能告訴我我的答案有什麼問題嗎? downvote困惑了我的廢話:) – Kleskowy 2014-10-08 10:19:33

回答

1

UNION使用整個元組來確定一行是否唯一。你的情況是(訂單,測試)。

由於你答案的一半有測試設置爲「是」,一個「不」,最終可能會得到多個具有相同ID的訂單(一個用於是,一個用於否)。

+0

我很專注於訂單ID,我完全沒有看到我的測試旗法律:-)謝謝你和阿德里亞諾。 – DanFromGermany 2014-10-08 10:29:11

0

你只能用「沒有」得行,因爲你在WHERE條款在最後規定那是什麼:

WHERE x.test = 'no' 

刪掉和UNION將返回從被聯合查詢唯一行

UNION不需要密鑰,雖然優化查詢幾乎總是一個好主意:)嘗試運行EXPLAIN (above query with UNION goes here)並查看生成的內容。

+1

不是我downvoting(我一般不downvote在我自己的問題上的答案),但我認爲這是因爲在哪裏不是問題在這裏:-) – DanFromGermany 2014-10-08 10:20:42

+0

所以我只是誤解了這個問題。謝謝。 – Kleskowy 2014-10-08 14:15:18