假设我有一个包含以下数据的表:
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,但是如何在PL SQL中实现呢?
谢谢
答案 0 :(得分:2)
我认为该查询可以帮助您找到所需的内容:
基本上我做了什么:
首先,我对每个货架的product_id做COUNT(DISTINCT )
,然后检查此计数是否等于或大于queryA产品列表,这意味着货架产品匹配。
然后,如果使用EXISTS()
排除了与queryA不匹配的产品,我将它们排除在外。如果您还想查看不匹配的产品,则无需使用该过滤器。
--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
)
答案 1 :(得分:2)
您可以按照以下步骤进行操作:
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(*) = . . .)
。
答案 2 :(得分:0)
您可以执行此操作-无需聚合。 (除了顶部查询中的forkpty
之外,如果您有一个附加表SELECT DISTINCT
以SHELVES
作为主键会更好一些,那么查询效率可能更高)
SHELF_ID