2012-04-18 38 views
1

我有這樣的查詢有兩種實現方式:爲什麼UNION ALL有和沒有括號表現不一樣?

SELECT race1, mode1 
FROM organization 
WHERE condition = 1 LIMIT 1 

UNION ALL 

(SELECT race2, mode2 
FROM organization 
WHERE condition = 1 LIMIT 1) 

UNION ALL 

(SELECT race, mode FROM organization_new 
WHERE PK_Id = 1) 

而且

SELECT race1, mode1 
FROM organization 
WHERE condition = 1 LIMIT 1 

UNION ALL 

SELECT race2, mode2 
FROM organization 
WHERE condition = 1 LIMIT 1 

UNION ALL 

SELECT race, mode FROM organization_new 
WHERE PK_Id = 1 

正如你所看到的,所不同的是僅在第一個查詢括號。 在第一個查詢中,我得到預期的結果(從所有三個選擇中獲得所有值,不需要解釋)。但是,當我繼續與第二個查詢,我得到的結果按要求,但不是如預期的,那只是從第一個選擇符合WHERE條款的值。也就是說,如果有race1, mode1其中condition = 1,那麼我只得到那個結果。如果沒有,那麼我得到race2, mode2,其中condition = 1。如果第二個select語句是空的,那麼我會根據第三個select語句獲取值。如果沒有提供括號,爲什麼UNION ALL的行爲類似於OR

編輯:我使用MySQL的5.0.51a

+0

您必須對所有查詢使用相同的別名ex: - race1作爲race,mode1作爲 – 2012-04-18 08:34:31

+0

@ sam_13模式,MySQL不需要它,列名將與第一個查詢中的名稱相同。在這種情況下'race1'和'mode1' .. – nawfal 2013-06-08 06:00:19

回答

2

那是因爲你使用的限制。

MySql參考指出,如果你想在單獨選擇中使用ORDER BY或LIMIT,那麼你必須用圓括號包圍你的選擇。

實施例(從MySQL參考):

由或LIMIT申請ORDER給個體SELECT,放置圍繞該括號內的子句SELECT:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) 
UNION 
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10); 

資源可以在這裏找到: http://dev.mysql.com/doc/refman/5.0/en/union.html

編輯:更改引用鏈接,因爲前一個是5.5版。但答案沒有改變。

+0

好吧,我明白了。我的問題是,如果我不想要所有的聯合,但就像它是如何處理我的第二個查詢(沒有括號)像'OR',我可以安全地繼續第二個查詢嗎? – nawfal 2012-04-18 09:17:13

+0

我的猜測是,這不會是真正有效的MySQL。由於我無法在發佈的引用中找到這種行爲,以及我的理解如何,因爲LIMIT,您的查詢的工作方式與此類似。當解析器解析代碼時,它會選擇數據並看到LIMIT。由於select不在括號中,因此它被理解爲查詢的結尾(查看引用,其中關於所有UNION的關於LIMIT和ORDER BY的內容在哪裏)。如果SELECT爲空,它會優化並跳過SELECT到下一個。 要檢查這項工作是否嘗試更改2.和3.選擇地點。然後嘗試如果查詢可以轉到3.如果1.和2.是空的。 – 2012-04-18 09:48:34

+0

@Janis謝謝..是的,它工作,沒有太多的測試,我不會問你:)我甚至可以這樣做:'(SELECT a FROM t1 WHERE a = 10 AND B = 1 ORDER BY a 10)UNION SELECT a FROM t2 WHERE a = 11 AND B = 2 ORDER BY a LIMIT 10)LIMIT 1;'如原始文檔中所述 – nawfal 2012-04-18 09:57:46