Определить, какой оператор ИЛИ выбрал запись? - PullRequest
0 голосов
/ 18 января 2011

У меня есть критерии, сохраненные в записях таблицы criteria, которые я использую для создания динамической строки запроса, которая будет запрашивать таблицу source, а результаты этого запроса будут вставлены в таблицу destination,Моя цель - также вставить идентификатор из таблицы criteria в таблицу destination, если критерии соответствуют записи в таблице source.Если найдено несколько записей критериев, я просто вставил бы первую.

Предложение WHERE строится из ИЛИ нескольких разделов вместе, и в каждом разделе критерии имеют вид AND'ed вместе.Примерно так:

insert into destinationTable(col1, col2, col3)
select col1, col2, col3
from sourceTable
where
--' begin generated code'
   (a = 525 and b = 324 and c = 4523) -- 'from criteria record 1'
or (d = 'asdf' and e = 3.43) -- 'from criteria record 2'
or (f = 234523 and g = 9823742) -- 'from criteria record 3'
etc...
--' end generated code'

Мне нужно найти способ определить, какой первый раздел ИЛИ соответствует критериям, и вставить соответствующий идентификатор критерия в таблицу назначения. Как это можно сделать?

Ответы [ 3 ]

7 голосов
/ 18 января 2011

Вы можете включить оператор case в предложение Select, которое выведет первое успешное предложение OR:

Select ...
    , Case
        When a = 525 And b = 324 And C = 4523 Then Criteria_Row_1_Pk
        When d = 'asdf' and e = 3.43 Then Criteria_Row_2_Pk
        ....
        End As SuccessClausePk
4 голосов
/ 18 января 2011

Замените или объединением и добавьте столбец с номером критерия

select col1, col2, col3, 1
from sourceTable
where
--' begin generated code'
   (a = 525 and b = 324 and c = 4523) -- 'from criteria record 1'
union all
select col1, col2, col3, 2
from sourceTable
where (d = 'asdf' and e = 3.43) -- 'from criteria record 2'
union all
select col1, col2, col3, 3
from sourceTable
where (f = 234523 and g = 9823742) -- 'from criteria record 3'
etc...
2 голосов
/ 18 января 2011

Если не существует индекса, который может обслуживать весь диапазон задействованных столбцов, вполне вероятно, что таблица будет полностью отсканирована. Поскольку мы просматриваем все записи, вы можете также выполнить определение до выполнения фильтра.

SELECT col1, col2, col3, Which
FROM
(
    select col1, col2, col3,
    CASE
    --' begin generated code'
    WHEN 
       (a = 525 and b = 324 and c = 4523) -- 'from criteria record 1'
    THEN 1
    WHEN
       (d = 'asdf' and e = 3.43) -- 'from criteria record 2'
    THEN 2
    WHEN
       (f = 234523 and g = 9823742) -- 'from criteria record 3'
    THEN 3
    --' end generated code'
    END Which
    from sourceTable
) SQ
WHERE Which is not null -- remove where it didn't match any criteria

Форма предсказуема и достаточно последовательна, чтобы быть удобной для генерации кода

...