Выберите пересечение многих значений в Oracle - PullRequest
0 голосов
/ 12 декабря 2018

У меня небольшая проблема с SQL, и мне нужна ваша помощь.Я запрашиваю базу данных Oracle из рабочего процесса (термин, относящийся к конкретному приложению).Мне нужно получить правильное значение catgeory из таблицы, которая выглядит как приведенная ниже, с учетом списка CRI_ID.

    CAT             CRI_ID
    268_0_43_BR     506
    268_0_43_BR     507
    268_0_43_BR     508
    268_0_43_BR     509
    462_406_42_TR   508
    462_406_42_TR   509

Кажется простым, но проблема в том, что один и тот же CRI_ID может иметь более одного CAT.Таким образом, в основном у меня была бы переменная $ {CRI_IDs}, которая содержит список CRI_IDs.Возьмите это в качестве примера:

  • $ {CRI_IDs} = 506,507, 508,509 >> Ожидаемый CAT = 268_0_43_BR
  • $ {CRI_IDs} = 508,509 >> Ожидаемый CAT = 462_406_42_TR

Это делает невозможным любое использование соединения / пересечения / подзапроса, так как я всегда получу обе категории обратно.Любая идея, что будет подходящим запросом в этом случае?

Я уже пробовал такие вещи, как ниже, но он возвращает обе категории.

    select cat from table where cri_id in (${CRI_IDs});
    select table.cat from table join (select ${CRI_IDs} from dual) tmp on table.cri_id=tmp.id;

Кстати, не стесняйтесь предполагать вместо переменной, котораяУ меня есть другая таблица (например, tmp), которая содержит список CR_ID в одном из столбцов

1 Ответ

0 голосов
/ 12 декабря 2018

Используйте GROUP BY и HAVING:

select cat
from t
group by cat
having sum(case when cri_id in (506, 507, 508, 509) then 1 else 0 end) = 4 and
       sum(case when cri_id not in (506, 507, 508, 509) then 1 else 0 end) = 0;

Предложение having подсчитывает, как строки могут соответствовать каждому условию.Первый ищет id, которые вы хотите для cat.= 4 указывает, что все должно быть там, при условии, что в таблице нет дубликатов.(Дубликаты легко обрабатываются, но они немного усложняют запрос.)

Второе условие ищет cri_id s , а не в списке.= 0 указывает, что ничего не найдено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...