2014-02-10 3 views
0
TABLE X 
col1,col2 
    1 , 2 
    1 , 7 
    1 , 4 
    1 , 8 
    2 , 3 
    2 , 1 
    2 , 2 
    3 , 1 
    3 , 8 
    3 , 9 
    3 , 4 
    4 , 5 
    4 , 3 
    4 , 2 
    4 , 8 
    4 , 4 

Я хочу, чтобы извлечь COL1 значения, содержащиеся в col2 значения 2 и 4 в этом случае он будет получать значения 1 и 4 Как я могу выполнить это без использования UNION ВСЕ оператор?запрос без оператора Union SQL

Запрос, который я использую это

select distinct col1 
     from X as A 
     where col1 = (
      select col1 from (
      select distinct col1 
      from X as B 
      where A.col1 = B.col1 and col2 = 2 
      union ALL 
      select distinct col1 
      from X as C 
      where A.col1 = C.col1 and col2 = 4 
     ) D 
     group by col1 
     having count(col1) > 1 
     ) 

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

ответ

1

Я думаю, что лучшее исполнение будет исходить от внутреннего присоединения таблицы с собой:

SELECT DISTINCT X1.col1 
FROM X X1 INNER JOIN X X2 ON X1.col1=X2.col1 
WHERE X1.col2=2 AND X2.col2=4 
2

Эта проблема называется Relational Division, вот один из способов сделать это:

SELECT col1 
FROM tablex 
WHERE col2 IN (2, 4) 
GROUP BY col1 
HAVING COUNT(DISTINCT col2) >=2 

HAVING COUNT(col2) >=2 гарантирует, что выбранный col1 должен иметь как два значения 2 и 4, по крайней мере.

+0

Действительно, демо вы прикреплены правильно - но запрос там отличается от один, который вы опубликовали в своем ответе. Разница заключается в 'DISTINCT' в' COUNT'. – PaF

+0

@PaF - запрос отлично работает и для случая, который вы объяснили без 'DISTINCT', см. [Здесь] (http://sqlfiddle.com/#!2/1aeeb/2) –

+0

повторяющиеся записи - это именно тот случай, когда я был говоря о :) – PaF

Смежные вопросы