SQL-Query - 查找另一个表的模式

Ger*_*eal 2 sql sql-server comparison

我有一张颜色的桌子:

COLORS

idColor   Name
-------   ------
   4      Yellow
   5      Green
   6      Red
Run Code Online (Sandbox Code Playgroud)

我有另一个数据表:

PRODUCTS

idProduct   idCategory   idColor
---------   ----------   -------
    1           1           4     
    2           1           5     
    3           1           6     
    4           2           10    
    5           2           11    
    6           2           12    
    7           3           4     
    8           3           5     
    9           3           8     
    10          4           4     
    11          4           5     
    12          4           6     
    13          5           4     
    14          6           4     
    15          6           5     
Run Code Online (Sandbox Code Playgroud)

我只想要从表(4,5,6)中的值出现在第二个表中Products时返回行,并且正好具有3个具有相同值的元素.idColorColorsIdCategoryidColor4, 5, 6

对于此示例,查询应返回:

IdCategory
----------
    1      
    4      
Run Code Online (Sandbox Code Playgroud)

Lam*_*mak 5

试试这个:

SELECT idCategory
FROM PRODUCTS
GROUP BY idCategory
HAVING COUNT(*) = 3
AND COUNT(DISTINCT CASE WHEN idColor IN (4,5,6) THEN idColor END) = 3
Run Code Online (Sandbox Code Playgroud)

这是一个你可以尝试的演示.

更新

如果要根据表"COLOR"的值动态过滤结果

SELECT idCategory
FROM PRODUCTS P
LEFT JOIN (SELECT idColor, COUNT(*) OVER() TotalColors
           FROM COLORS) C
     ON P.idColor = C.idColor
GROUP BY idCategory
HAVING COUNT(*) = MIN(C.TotalColors)
AND COUNT(DISTINCT C.idColor) = MIN(C.TotalColors)
Run Code Online (Sandbox Code Playgroud)

这是一个小例子.