Получить родительское значение на основе соответствия дочернего значения в запросе SQL - PullRequest
0 голосов
/ 11 декабря 2019

Мне нужно родительское табличное значение из запроса на выборку, где дочернее значение родителя из нескольких или все находятся в дочерней таблице.

Позвольте мне привести пример.

Категория Родительская таблица

CatId PrdId
-----------
Cat1  prd1
Cat1  prd2
Cat1  prd3
Cat2  prd4
Cat2  prd5
Cat2  prd6

Product Child Table

PrdId
-----
prd1
prd2
prd3
prd4
prd5

Я использую oracle sqldevloper. См. Запрос ниже,

Select Category.CatId 
from Category cat 
  left join Product prd ON cat.PrdId = prd.PrdId

Этот запрос дает мне результаты Cat1, Cat2, но он должен получить только Cat1, поскольку значение Cat2 prd6 недоступно в таблице Product.

Редактировать: Можем ли мы достичь этогобез использования group by и count?

Ответы [ 3 ]

1 голос
/ 11 декабря 2019

А как насчет этого решения?

select distinct catid from category where catid not in (
select distinct c.catid from category c left join product p on (c.prdid = p.prdid) where p.prdid is null);

Вы в основном выбираете все продукты и назначаете им соответствующую категорию. Тем, у кого нет категории, присваивается значение NULL. Затем вы выбираете только те категории, которые имеют NULL, и удаляете такой список категорий из другого выбора, содержащего все категории.

1 голос
/ 11 декабря 2019

Вы можете использовать GROUP BY и HAVING следующим образом:

SQL> WITH CATEGORY AS (
  2      SELECT 'Cat1' CATID, 'prd1' PRDID FROM DUAL UNION ALL
  3      SELECT 'Cat1' CATID, 'prd2' PRDID FROM DUAL UNION ALL
  4      SELECT 'Cat1' CATID, 'prd3' PRDID FROM DUAL UNION ALL
  5      SELECT 'Cat2' CATID, 'prd4' PRDID FROM DUAL UNION ALL
  6      SELECT 'Cat2' CATID, 'prd5' PRDID FROM DUAL UNION ALL
  7      SELECT 'Cat2' CATID, 'prd6' PRDID FROM DUAL
  8  ), PRODUCT AS (
  9      SELECT 'prd1' PRDID FROM DUAL UNION ALL
 10      SELECT 'prd2' PRDID FROM DUAL UNION ALL
 11      SELECT 'prd3' PRDID FROM DUAL UNION ALL
 12      SELECT 'prd4' PRDID FROM DUAL UNION ALL
 13      SELECT 'prd5' PRDID FROM DUAL
 14  ) -- Your actual solution starts from here
 15  SELECT CAT.CATID
 16  FROM CATEGORY CAT LEFT JOIN PRODUCT P ON CAT.PRDID = P.PRDID
 17  GROUP BY CAT.CATID
 18  HAVING COUNT(CASE WHEN P.PRDID IS NULL THEN 1 END) = 0;

CATI
----
Cat1

SQL>

Cheers !!

0 голосов
/ 11 декабря 2019

То, что вы ищете, называется реляционное деление . Это операция, основанная на реляционной алгебре, в некоторой степени ее можно рассматривать как обратную к декартовому произведению. К сожалению, он не имеет прямой поддержки в стандарте SQL. Вы можете эмулировать его двумя not exist с или group by + having count.

Это ИМХО лучшая статья на эту тему. Из нее вы можете легко узнать, как применить оба способа к вашему примеру.

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