2013-02-04 49 views
2

我想了解具有多個「設置」運算符的現有查詢發生了什麼。我嘗試過的各種網頁搜索都沒有透露任何內容,也沒有對Teradata文檔進行快速審覈。單個查詢中多個SQL集操作符的作用是什麼?

下面是該查詢的僞代碼表示我看:

SELECT column from table1 
UNION 
SELECT column from table2 
UNION 
SELECT column from table3 
MINUS 
    (select column from table 4) 
UNION 
SELECT column from table4 

我在MINUS如何處理最感興趣;它是否僅從前面的表3中的SELECT減去行,還是從組合結果集中減去?請注意,MINUS表達式中的圓括號位於我正在查看的代碼中。

此外,我假設最後的UNION完全不受MINUS的操作。我確信我可以通過創建一些示例表來自己弄清楚這一點,但我現在無法訪問數據庫(試圖在今天從家中完成一些工作)。

僅供參考:Teradata MINUS與ANSI EXCEPT相同。

+0

那些'SET'在哪裏? – gdoron

+0

@gdoron我指的是「設置」操作符;在Teradata中,「MINUS」與「EXCEPT」相同。 – BellevueBob

回答

4

甲骨文 http://docs.oracle.com/cd/B28359_01/server.111/b28286/queries004.htm

您可以使用集合運算符UNION,UNION ALL ,相交,再減去結合多個查詢。所有集合運營商有同等優先。如果 一條SQL語句包含多個集合運算符,那麼Oracle數據庫 會從左至右評估它們,除非括號明確指定 指定另一個順序。

http://www.postgresql.org/docs/current/static/sql-select.html#SQL-EXCEPT

多除了在上述SELECT語句運算符的計算 從左到右,除非用圓括號指明。除了綁定在 與UNION相同的級別。

然而,PostgreSQL的在同一個SELECT語句

http://www.postgresql.org/docs/current/static/sql-select.html#SQL-INTERSECT

的多個INTERSECT操作符是 從左向右計算的,除非用圓括號指明。 INTERSECT比UNION綁定的更緊密。也就是說,A UNION B INTERSECT C將被讀爲A UNION(B INTERSECT C)。

強調,在任何引號的,是我自己做的..

所以,這取決於執行。

0

我相信絕大多數數據庫都是從上到下的順序進行構建的。理想的情況是,你應該寫的代碼,以反映你想要的優先級,例如,

(((
SELECT column from table1 
UNION 
SELECT column from table2 
) a 
UNION 
SELECT column from table3 
) b 
MINUS 
    (select column from table 4) 
) c 
UNION 
SELECT column from table4 
1

你可以看到甲骨文如何處理它在this sqlfiddle - 它適用於MINUS聚集,直到該點的整個集合。其他數據庫的工作類似,並且賠率是Teradata自EXCEPT(其中Oracle和Teradata稱爲MINUS)是ANSI標準運算符。

1

JayC的回答給了我一個關於如何搜索的線索,並且我能夠找到正確的Teradata參考。我會爲未來的讀者添加這個。從第6章,SQL函數,操作符,表達式和謂詞

The precedence for processing set operators is as follows: 
1 INTERSECT 
2 UNION and MINUS/EXCEPT 
The set operators evaluate from left to right if no parentheses explicitly specify another order. 

甚至還有類似於我的情況爲例。 Here is a link下載PDF。

相關問題