Как «по умолчанию» столбец в запросе SELECT - PullRequest
0 голосов
/ 04 декабря 2009

Скажем, у меня есть таблица базы данных T с 4 полями, A, B, C и D. A, B и C являются первичными ключами. Для любой комбинации [A, B] всегда есть строка, где C == spaces. Там могут быть или не быть другие строки, где C != spaces. У меня есть запрос, который получает все строки, где [A, B] == [in_a, in_b], а также где C == in_c, если такая строка существует, или C == spaces, если строка in_c не существует. Итак, если есть строка, которая соответствует определенному значению C, я хочу эту, в противном случае я хочу пробелы один. Очень важно, чтобы при наличии подходящей строки в Си мне не возвращались пробелы вместе с ней.

У меня есть рабочий запрос, но он не очень быстрый. Это выполняется в DB2 для 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 = " ");

Ответы [ 3 ]

1 голос
/ 04 декабря 2009

Caveat emptor , поскольку я не знаком с 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 голосов
/ 04 декабря 2009

Почему бы не запустить советник по индексам и не прочитать его советы? (или это только в DB2 для i / OS?)

Мы используем советника для очень большой производственной среды, и он дает отличные советы. Но, сказав это, всегда хорошо начать с хорошего утверждения.

0 голосов
/ 04 декабря 2009

Это будет работать в 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

Убедитесь, что значение '' соответствует фактическому значению столбца.

Удачи,

...