PL SQL-запрос, чтобы найти список идентификаторов, который соответствует всем значениям в списке - PullRequest
0 голосов
/ 02 декабря 2018

Предположим, у меня есть таблица со следующими данными:

SHELF_ID    PRODUCT_ID

shelf1      product1
shelf1      product2
shelf1      product3
shelf2      product1
shelf2      product2
shelf3      product1

Я сделал запрос 'queryA', который возвращается из другой таблицы

PRODUCT_ID

product1
product2

Теперь я хочу использовать'queryA' в другом запросе, чтобы определить, на каких полках есть по крайней мере все продукты, возвращенные в 'queryA'

. Глядя на первую таблицу, вы легко понимаете ее полки1 и полку2, но как мне сделать это в PLSQL?

Спасибо

Ответы [ 3 ]

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

Вы можете сделать это следующим образом:

with products as (
      <your query here)
     )
select s.shelf_id
from shelves s join
     products p
     on s.product_id = p.product_id
group by s.shelf_id
having count(distinct s.product_id) = (select count(*) from products);

По сути, это подсчитывает количество совпадений на каждой полке и гарантирует, что количество совпадений является общим количеством товаров.

Если в shelves нет дубликатов, вы можете использовать having count(*) = . . .).

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

Вы можете сделать это - агрегация не требуется.(Кроме SELECT DISTINCT в верхнем запросе; было бы НАМНОГО лучше, если бы у вас была дополнительная таблица, SHELVES, с SHELF_ID в качестве первичного ключа, тогда запрос мог бы быть гораздо более эффективным.)

select distinct shelf_id
from   shelves s
where  not exists (select product_id
                   from   queryA   -- Your existing query goes here
                   where  (s.shelf_id, product_id) 
                              not in (select shelf_id, product_id
                                      from   shelves
                                     )
                  )
;
0 голосов
/ 02 декабря 2018

Я думаю, что этот запрос может помочь вам найти то, что вы хотите:

В основном, что я сделал: сначала я сделал COUNT(DISTINCT ) для product_id для каждой полки, а затем проверил, равно ли это число или больше, чем queryAсписок продуктов, которые означают, что продукты полки соответствуют.Затем я исключил продукты, если они не совпадают с queryA, используя EXISTS().Если вы хотите видеть также несоответствующие товары, вам не нужно использовать этот фильтр.

--DROP TABLE shelves;
CREATE TABLE shelves
(
    SHELF_ID    VARCHAR(100)
    ,PRODUCT_ID VARCHAR(100)
);

INSERT INTO shelves
VALUES 
 ('shelf1','product1')
,('shelf1','product2')
,('shelf1','product3')
,('shelf2','product1')
,('shelf2','product2')
,('shelf3','product1');

--DROP TABLE queryA;

CREATE TABLE queryA
(
    PRODUCT_ID  VARCHAR(100)
);

INSERT INTO queryA VALUES ('product1'),('product2');

SELECT  * 
FROM shelves S
WHERE S.SHELF_ID IN (           
                    SELECT S.SHELF_ID
                            --,COUNT(DISTINCT S.PRODUCT_ID) PRODUCTCOUNT
                    FROM shelves S
                    GROUP BY S.SHELF_ID
                    HAVING COUNT(DISTINCT S.PRODUCT_ID)>=(SELECT COUNT(DISTINCT PRODUCT_ID) 
                                                            FROM queryA Q  )        
                    )
AND EXISTS (SELECT 1 
            FROM queryA Q
            WHERE S.PRODUCT_ID = Q.PRODUCT_ID
            )
...