SQL中的EXCEPT查询

时间:2011-10-14 19:11:48

标签: sql database db2

我正在SQL中执行一个除了查询

Q1除了Q3之外的第二季度

其中Q1,Q2和Q3是子查询。 我只是想知道它的输出是什么(Q1-Q2)-Q3或Q1-(Q2-Q3)?如果第二,如何获得第一个作为输出?

2 个答案:

答案 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)

但是,最好使用括号来确定评估顺序是您想要的。

答案 1 :(得分:0)

SQL-92标准证实(附件C)应该相当直观:在没有括号的情况下,示例代码中EXCEPT的两次出现(显然)都处于同一优先级,在这种情况下,他们将按从左到右的顺序进行评估。

出于兴趣,EXCEPTINTERSECTUNION(括号除外)的优先级取决于实现,因此请参阅SQL产品的文档。但是,快速谷歌似乎表明大多数SQL产品(包括DB2)的优先级为EXCEPTUNION,优先级高于INTERSECT