2011-10-14 16 views
0

查詢我除了查詢在這樣的SQL除了在SQL

Q1 EXCEPT Q2 Q3除外

其中Q1,Q2和Q3子查詢做一個。 我只想知道它的輸出是什麼,(Q1-Q2)-Q3或Q1-(Q2-Q3)?如果是第二,如何獲得第一個作爲輸出?

+0

這對實際的代碼來說會容易得多。 – Johan

+0

按照您在問題中提出的建議將它們括在括號中。 – 2011-10-14 19:14:50

+0

我們應該如何知道輸出是什麼? –

回答

4

我沒有DB2的安裝,但在PostgreSQL中,Q1 except Q2 except Q3出現要被內插爲(Q1 except Q2) except Q3(注:generate_series(m,n)是PostgreSQL中的功能,其生成的整數值的從mn單個列(其中m<n當然)):

select generate_series(1,10) except select generate_series(5,15) except select generate_series(10,20); 


generate_series 
----------------- 
       1 
       2 
       3 
       4 
(4 rows) 

select * from (select generate_series(1,10) except select generate_series(5,15))a except select generate_series(10,20); 


generate_series 
----------------- 
       1 
       2 
       3 
       4 
(4 rows) 

select generate_series(1,10) except select * from (select generate_series(5,15) except select generate_series(10,20))a; 


generate_series 
----------------- 
       1 
       2 
       3 
       4 
       10 
(5 rows) 

然而,這是最好用括號做出一定的評價的順序是你想要的。

+0

thanx很多,我認爲這是它 – Vishal

+0

不客氣。 :) – 2011-10-14 19:27:31

+1

由於爲了清晰起見,對於parens的建議,我贊成。非常同意。任何時候你必須停下來思考,沒有他們那麼糟糕。 –

0

SQL-92標準確認了(附錄C)什麼應該相當直觀:如果沒有括號,示例代碼中的兩個出現的EXCEPT顯然會處於相同的優先級,在這種情況下他們應按照從左到右的順序進行評估。

出於興趣的EXCEPTINTERSECTUNION(括號除外)的優先級是實現相關,所以請參閱SQL產品的文檔。然而,谷歌似乎表示,大多數SQL產品(包括DB2)的優先級爲EXCEPTUNION,優先級爲INTERSECT