我有三个看起来像这样的表:

PROD

Prod_ID|Desc
------------
P1|Foo1
P2|Foo2
P3|Foo3
P4|Foo4
...

RAM
Ram_ID|Desc
------------
R1|Bar1
R2|Bar2
R3|Bar3
R4|Bar4
...

PROD_RAM
Prod_ID|Ram_ID
------------
P1|R1
P2|R2
P3|R1
P3|R2
P3|R3
P4|R3
P5|R1
P5|R2
...

PROD_RAM 表描述了 PROD RAM 之间的多对多关系。

给定一个像Ram_ID这样的(R1,R3)集,我想找到所有给定集合的PROD正好是ONE或ALL的所有RAM

给定(R1,R3)应该返回例如P1P4P5;不应返回P3,因为它具有R1R3以及R2

什么是最快的查询来获取所有给定PROD集合的Ram_ID恰好是一个或全部的RAM

编辑:PROD_RAM表可能包含大于1-> 3的关系,因此,“计数” = 1或= 2的“硬编码”检查不是可行的解决方案。

最佳答案

您可以尝试提高速度的另一个解决方案是这样的

;WITH CANDIDATES AS (
    SELECT  pr1.Prod_ID
            , pr2.Ram_ID
    FROM    PROD_RAM pr1
            INNER JOIN PROD_RAM pr2 ON pr2.Prod_ID = pr1.Prod_ID
    WHERE   pr1.Ram_ID IN ('R1', 'R3')
)
SELECT  *
FROM    CANDIDATES
WHERE   CANDIDATES.Prod_ID NOT IN (
            SELECT  Prod_ID
            FROM    CANDIDATES
            WHERE   Ram_ID NOT IN ('R1', 'R3')
        )

或者如果您不喜欢重复设置的条件
;WITH SUBSET (Ram_ID) AS (
    SELECT  'R1'
    UNION ALL SELECT 'R3'
)
, CANDIDATES AS (
    SELECT  pr1.Prod_ID
            , pr2.Ram_ID
    FROM    PROD_RAM pr1
            INNER JOIN PROD_RAM pr2 ON pr2.Prod_ID = pr1.Prod_ID
            INNER JOIN SUBSET s ON s.Ram_ID = pr1.Ram_ID
)
, EXCLUDES AS (
    SELECT  Prod_ID
    FROM    CANDIDATES
            LEFT OUTER JOIN SUBSET s ON s.Ram_ID = CANDIDATES.Ram_ID
    WHERE   s.Ram_ID IS NULL
)
SELECT  *
FROM    CANDIDATES
        LEFT OUTER JOIN EXCLUDES ON EXCLUDES.Prod_ID = CANDIDATES.Prod_ID
WHERE   EXCLUDES.Prod_ID IS NULL

10-04 11:15