Oracle SQL - Что быстрее, чем 3 "и существует ()" в пространстве где? - PullRequest
2 голосов
/ 23 января 2012

Есть ли лучший способ написать

Select distinct id_no
from revenue_table
where (exists (select * from revenue_table i 
       where revenue_type = 'Shipping' and i.id_no = r.id_no)
  and exists(select * from revenue_table i 
       where revenue_type = 'Reproduction' and i.id_no = r.id_no)
  and exists(select * from revenue_table i 
       where revenue_type = 'Tape' and i.id_no = r.id_no))

id_no представляет форму, которая вводится в таблицу один раз для каждой позиции дохода в форме.Один и тот же тип дохода может появляться несколько раз.Есть много продвинутых функций, которые работают с использованием логики ИЛИ, но я не могу найти какие-либо функции с использованием теории множеств И.Было бы очень хорошо, если бы в GROUP BY была какая-то функция для сравнения группы, такой как id_no, с набором типа (Доставка, Воспроизведение, Лента)

Существует ли это?

Ответы [ 3 ]

5 голосов
/ 23 января 2012

Другой вариант будет

SELECT id_no
FROM   revenue_table
WHERE  revenue_type IN ( 'Tape', 'Shipping', 'Reproduction' )
GROUP  BY id_no
HAVING COUNT(DISTINCT revenue_type) = 3  

Вам придется проверить, является ли это улучшением.

2 голосов
/ 23 января 2012

Ряд реляционных операторов подразумевает логическое И, например, соединение, ограничение, расширение, пересечение.

Подойдет SQL INTERSECT, например,

SELECT id_no
  FROM revenue_table
 WHERE revenue_type = 'Shipping' 
INTERSECT
SELECT id_no
  FROM revenue_table
 WHERE revenue_type = 'Reproduction' 
INTERSECT
SELECT id_no
  FROM revenue_table
 WHERE revenue_type = 'Tape';
1 голос
/ 23 января 2012

Да, вы можете сделать это с INNER JOIN:

select distinct r.id_no 
from revenue_table r
inner join revenue_table i1 on i1.id_no = r.id_no and i1.revenue_type = 'Shipping'
inner join revenue_table i2 on i2.id_no = r.id_no and i2.revenue_type = 'Reproduction'
inner join revenue_table i3 on i3.id_no = r.id_no and i3.revenue_type = 'Tape'
...