2016-05-31 3 views
2

Допустим, у меня есть следующие две таблицыSQL Query - Одно значение столбцов в двух разных колонках

Table 1 

Column1 Column2 Column3 
    1  A  ABC 
    1  B  DEF 
    1  C  DEF 
    1  D  GHI 
    1  E  GHI 
    2  A1  ABC 
    2  B1  DEF 
    2  C1  DEF 
    2  D1  GHI 


Table 2 

Column1 DEF  GHI 
    X  B  D 
    X  C  D 
    X  C  E 
    X  G  D 
    Z  B  D 

Два значения столбца 3 таблицы 1 являются столбцы в таблице 2, и эти столбцы заполняются данными в таблице1.column2.

Теперь мне нужно написать запрос SQL таким образом, что для каждой группы в таблице 1 (группы на основе table1.column1), я могу получить все значения в таблице 2, которая состоит из всех значений в DEF группы в table2.column2 и все GHI значений в table2.column3

Например, для данной таблицы, мой ожидаемый результат должен быть только X. Поскольку Х имеет как в и с в колонке DEF и имеет как D, так и E в колонке GHI. Z, с другой стороны, не содержит C в столбце DEF.

Может ли кто-нибудь вести меня о том, как действовать дальше и как мне это сделать?

+0

Можете ли вы помечать с соответствующей базой данных (Oracle я угадывание)? 'PIVOT' - это то, что вы ищете. –

+0

Как бы PIVOT помог мне в этом случае? –

+0

Извините, неверно сформулировал вопрос - подумал, что вы пытаетесь получить t2 от t1 –

ответ

2

Это кажется сложным. Я думаю, вы можете дважды присоединиться к таблице 2 к таблице 1 - по одному для каждого столбца. Это получает все совпадения для каждого table1.col1.

Затем запрос может агрегировать результаты и проверить, завершены ли все совпадения. Поскольку это происходит по двум направлениям, положение having необходимо использовать count(distinct):

select t2.col1, t1.col1 
from table2 t2 join 
    table1 tdef 
    on tdef.col3 = 'DEF' and tdef.col2 = t2.def join 
    table1 tghi 
    on tghi.col3 = 'GHI' and tghi.col2 = t2.ghi and tghi.col1 = tdef.col1 join 
    (select sum(case when t1.col3 = 'DEF' then 1 else 0 end) as cnt_def, 
      sum(case when t1.col3 = 'GHI' then 1 else 0 end) as cnt_ghi 
     from table1 t1 
    ) tt1 
    on tt1.col1 = tdef.col1 
group by t2.col1 
having count(distinct tdef.col2) = tt1.cnt_def and 
     count(distinct tghi.col2) = tt1.cnt_ghi; 
+0

Спасибо. Позвольте мне попробовать! : D –

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