2012-05-15 5 views
2

Я пытаюсь получить ключ Идентификатор группы из таблицы моста, который выглядит примерно так:Получить идентификатор группы из моста таблицы

GROUP_KEY DIM_KEY 
    1  11 
    1  12 
    1  13 
    1  14 
    2  11 
    2  12 
    3  11 
    3  12 
    3  13 
    3  15 
    4  11 
    5  11 
    5  12 
    5  13 

Я искал немного приобретаемого запрос:

SELECT b1.group_key 
FROM BRIDGE b1 
JOIN BRIDGE b2 ON (b1.group_key= b2.group_key) 
JOIN BRIDGE b3 ON (b1.group_key= b3.group_key) 
WHERE b1.dim_key = 11 
    AND b2.dim_key = 12 
    AND b3.dim_key = 13; 

Но это дает мне 1,3 и 5, и я хочу только 5, я могу отфильтровать его дальше с помощью aa count = 3, но мой вопрос в том, есть ли лучший способ? Я использую btw PL/SQL.

+0

Так как указанные вами условия соответствуют 1, 3 и 5 групповым клавишам, вам нужно указать дополнительные условия, чтобы получить только 5. Насколько я вижу, вы получили правильный ответ на свой вопрос. –

+0

@SzilardBarany Я отправил свой запрос с графом, но я чувствую, что это очень громоздко, я искал что-то более элегантное, я рассчитываю на Stack Gurus: D. – RMartins

ответ

1

EDIT

если вы используете Oracle 11g, попробуйте следующий

SELECT group_key FROM (
SELECT GROUP_KEY, listagg(DIM_KEY, ',') WITHIN GROUP(ORDER BY DIM_KEY) DIM_KEY 
    FROM t 
    GROUP BY GROUP_KEY) WHERE dim_key = '11,12,13' 
+0

group_key - это то, что я хочу вернуть, проверить мой ответ на Arion;). Thx – RMartins

+0

@ user1383116: Хорошо, но по каким критериям? почему group_key 5 является тем, который должен отображаться? потому что он имеет точно dim_key 11, 12 и 13? – mcha

+0

yes :), например, если я предоставляю dim_key 11, я хочу получить group_key 4.If я предоставляю dim_keys 11 и 12, мне нужен групповой ключ 3. Я ожидаю некоторый динамический SQL, но я хочу сначала определить «базовый запрос». – RMartins

0

Я не знаю, чего вы хотите. Но если вы хотите, чтобы отсчет был 3. После этого вы можете сделать это следующим образом:

WITH CTE 
(
    SELECT 
     COUNT(GROUP_KEY) OVER(PARTITION BY GROUP_KEY) AS Counts, 
     BRIDGE.* 
    FROM 
     BRIDGE 
) 
SELECT 
    * 
FROM 
    CTE 
WHERE 
    CTE.Counts=3 
    AND CTE.dim_key IN(11,12,13); 
+0

Я хочу избежать count @Arion. Этот запрос работает: 'ВЫБОР b1.group_key от моста b1 РЕГИСТРИРУЙТЕСЬ BRIDGE В2 (b1.group_key = b2.group_key) РЕГИСТРИРУЙТЕСЬ BRIDGE b3 ON (b1.group_key = b3.group_key) ГДЕ b1.dim_key = 11 И b2.dim_key = 12 И b3.dim_key = 13 И b1.group_key = (SELECT group_key ОТ МОСТА GROUP BY group_key HAVING COUNT (*) = 3); ', но не очень аккуратным, я ищу лучшее решение. Спасибо. – RMartins

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