【问题标题】:How to "default" a column in a SELECT query如何在 SELECT 查询中“默认”列
【发布时间】:2009-12-04 04:58:33
【问题描述】:

假设我有一个包含 4 个字段 A、B、C 和 D 的数据库表 T。A、B 和 C 是主键。对于 [A, B] 的任意组合,总有一行 C == spacesC != 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


【解决方案1】:

请注意,因为我不熟悉 DB2 SQL...

您可以尝试使用 ORDER BY 子句对匹配的行进行排序,使得带有 c = 空格的行在排序集中的最后一行,然后仅检索该集中的第一行。比如:

select first
    A, B, C, D
  from T
  where A = :IN_A
    and B = :IN_B
  order by C desc;

这假设 FIRST 和 ORDER BY DESC 子句符合我的预期。

【讨论】:

    【解决方案2】:

    这将适用于 DB2 LUW,不确定 order by 子句是否适用于 DB2 Z:

    select 
       a, b, c, d 
      from t 
     where a = :IN_A 
       and b = :IN_B 
       and c in (:IN_C,'  ') 
    order by 
       case c when '  ' then 2 else 1 end 
    fetch first 1 row only
    

    确保 ' ' 值与列的实际值匹配。

    祝你好运,

    【讨论】:

      【解决方案3】:

      为什么不启动索引顾问并阅读它的建议? (或者这仅在 DB2 for i/OS 上?)

      我们将顾问用于我们非常大的生产环境,它提供了很好的建议。不过话虽如此,从一个好的陈述开始总是好的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-13
        • 1970-01-01
        • 2018-09-17
        相关资源
        最近更新 更多