【发布时间】:2009-12-04 04:58:33
【问题描述】:
假设我有一个包含 4 个字段 A、B、C 和 D 的数据库表 T。A、B 和 C 是主键。对于 [A, B] 的任意组合,总有一行 C == spaces。 C != spaces 可能有也可能没有其他行。我有一个查询,它获取[A, B] == [in_a, in_b] 的所有行,以及C == in_c(如果存在这样的行)或C == spaces(如果in_c 行不存在)。所以,如果有一行与特定的 C 值匹配,我想要那个,否则我想要空格。非常重要的是,如果有匹配的 C 行,则不会将空格与它一起返回。
我有一个有效的查询,但它不是很快。这是在 DB2 for z/OS 上执行的。我可以完全控制这些表,因此我可以在需要时定义新的索引。现在表上唯一的索引是[A, B, C],主键。这个 SQL 有点乱,我觉得有更好的方法来完成这个任务。我该怎么做才能使这个查询更快?
我现在的查询是:
SELECT A, B, C, D FROM T
WHERE A = :IN_A AND B > :IN_B AND
(C = :IN_C
OR (NOT EXISTS(
SELECT B FROM T WHERE
A = :IN_A AND B > :IN_B AND C = :IN_C))
AND C = " ");
【问题讨论】:
-
糟糕,SQL 中有一个 = 而不是 >。这个查询总是返回多行,因此 B > :IN_B 部分。
标签: sql select db2 query-optimization