Упростить существующий запрос в Oracle

#sql #oracle #count #subquery #having-clause

#sql #Oracle #количество #подзапрос #наличие-предложение

Вопрос:

Как я могу упростить приведенный ниже запрос, чтобы возвращать field2 только в том случае, если существуют записи с key_id ECRU и MTR.

 SELECT
    z.field2
FROM
    mytable z
WHERE
        z.key_id = 'ECRU'
    AND EXISTS (
        SELECT
            1
        FROM
            mytable
        WHERE
                key_id = 'MTR'
            AND field2 = z.field2
    )
  

Ответ №1:

Вы могли бы использовать group by и having :

 select field2
from mytable
where key_id in ('ECRU', 'MTR')
group by field2
having count(*) = 2
  

Это не предполагает дублирования (field2, key_id) . В противном случае вам нужно немного изменить having предложение:

 having count(distinct key_id) = 2
  

Комментарии:

1. Это должна быть операция AND, и могут быть другие значения ключа, отличные от указанных.

2. @FurqanShaikh но в вопросе нет других упомянутых значений. Это решает то, что вы уже спрашивали.

3. Я думаю, что использование intersect может упростить это. ВЫБЕРИТЕ field2 ИЗ mytable ГДЕ key_id = ‘ECRU’ ПЕРЕСЕКАЕТСЯ ВЫБЕРИТЕ field2 ИЗ mytable ГДЕ key_id = ‘MTR’ будет ли это иметь какое-либо влияние на производительность по сравнению с предыдущим коррелированным запросом?