2009-12-04 21 views
0

說我有與4個字段,A,B,C和D,A,B數據庫表T 「默​​認」 的列,和C是主鍵。對於[A,B]的任何組合,總有一行在哪裏C == spaces。有或沒有其他行C != spaces。我有一個查詢,獲取其中[A, B] == [in_a, in_b],並在那裏C == in_c如果這樣的行存在,或者C == spaces如果in_c行不存在,所有行。所以,如果有一行匹配特定的C值,我想要那個,否則我想要空格之一。如果有一個匹配的C行,這是非常重要的,我不會被返回的空間之一。如何在SELECT查詢

我有一個工作查詢,但它不是非常快。這在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 = " "); 
+0

哎呀,在SQL中有a =而不是a>。該查詢總是返回多行,因此B>:IN_B部分。 – 2009-12-04 05:24:18

回答

0

這將在DB2 LUW工作,如果order by子句適用於DB2ž不知道:

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 

確保'值的列的實際價值相匹配。

祝你好運,

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子句做我期望他們做的。

0

爲什麼不啓動索引顧問和讀取其建議? (或者是這個只在DB2 for I/OS?)

我們使用顧問對我們非常大的生產環境,它提供了很大的意見。但有這樣的說法,從一個好的聲明開始總是好的。