DB2 - 子查询的位置

时间:2017-12-01 11:10:52

标签: sql db2

我目前在db2中遇到以下表格的问题:

Table_1
A       B        C
1       2        1
2       1        2
3       2        2
4       1        1

Table_2
A
1

我想从table_1中选择BC大于A的所有table_2条记录。结果应该是:

Query
A       B        C
1       2        1
2       1        2
3       2        2

我目前通过此查询实现:

select A, B, C
from Table_1
where B > (select max(A) from Table_2) 
or    C > (select max(A) from Table_2)

是否可以在where子句中仅发出一个subselect以提高性能?

3 个答案:

答案 0 :(得分:1)

我会把它写成:

select A, B, C
from Table_1
where MAX(B,C) > (select max(A) from Table_2) 

注意:未经测试,因为我没有方便的DB2数据库。

这是MySQL语法中的SQLfiddle:http://sqlfiddle.com/#!9/2f89c5/3

答案 1 :(得分:0)

如果这是你需要的,那么将子查询移到FROM子句:

select t1.A, t1.B, t1.C
from Table_1 t1 cross join
     (select max(A) as maxA from table_2) t2
where t1.B > t2.maxA or t1.C > t2.maxA;

答案 2 :(得分:0)

反之亦然:您希望所有不存在的table1记录表2记录的A值很高:

select *
from table_1
where not exists
(
  select *
  from table_2
  where table_2.a >= table_1.b
    and table_2.a >= table_1.c
);

顺便说一句:只有一个子查询非常适合维护。改变它只需要在一个地方进行。但至于速度:在您的查询中,子查询与主查询没有关联,因此它可能只运行一次,其结果应用于所有检查。 (这将是愚蠢的,DBMS是否一次又一次地为table_1中的每个记录和列运行相同的子查询。)