我正在SQL中执行一个除了查询
Q1除了Q3之外的第二季度
其中Q1,Q2和Q3是子查询。 我只是想知道它的输出是什么(Q1-Q2)-Q3或Q1-(Q2-Q3)?如果第二,如何获得第一个作为输出?
答案 0 :(得分:4)
我没有安装DB2,但是在PostgreSQL中,Q1 except Q2 except Q3
似乎被内插为(Q1 except Q2) except Q3
(注意:generate_series(m,n)
是在PostgreSQL中找到的一个生成单个函数的函数从m
到n
的整数值列(当然,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
的两次出现(显然)都处于同一优先级,在这种情况下,他们将按从左到右的顺序进行评估。
出于兴趣,EXCEPT
,INTERSECT
和UNION
(括号除外)的优先级取决于实现,因此请参阅SQL产品的文档。但是,快速谷歌似乎表明大多数SQL产品(包括DB2)的优先级为EXCEPT
和UNION
,优先级高于INTERSECT
。