PL SQL查询以查找与列表中的所有值匹配的标识符列表

时间:2018-12-01 22:13:54

标签: sql oracle plsql subquery

假设我有一个包含以下数据的表:

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中实现呢?

谢谢

3 个答案:

答案 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 DISTINCTSHELVES作为主键会更好一些,那么查询效率可能更高)

SHELF_ID