#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’ будет ли это иметь какое-либо влияние на производительность по сравнению с предыдущим коррелированным запросом?