按组 ID 使用 SQL 服务器过滤

Filter with SQL Server by Group ID

我有两个表,我需要根据过滤器 ID 来过滤数据,这取决于与过滤器组 ID 的关系。

例如我有这两个表:

Table 1:

ItemID FilterID
3 122
3 123
3 4
17 123

Table 2:

FilterID FilterGroupID
122 5
123 5
4 1

期望的输出:

我对这个查询有点迷茫,我很乐意得到一些帮助。

我会尽量简化它:假设我们有大小组过滤器和颜色组过滤器。如果我按尺码 S 或 M 过滤,则我需要获取所有具有该尺码的商品。如果我想添加蓝色之类的颜色,那么答案会将结果削减为:尺寸为 S 或 M 且颜色为蓝色的项目。所以来自不同组的过滤器可能会减少一些结果

您似乎想要从 each [=12] 中获取每个具有 至少一个 匹配过滤器的每个 ItemID =] 在您的过滤器输入中。所以在每个组中你有 or 逻辑,在组之间你有 and 逻辑

如果您将输入存储在 table 变量或 Table 值参数中,那么您可以使用正常的关系除法技术。

这就变成了Relational Division With Remainder的问题,有多个除数。

切蛋糕的方法有很多种。这是一个选项

  • 将过滤器输入加入组,得到每个过滤器的组ID
  • 使用 DENSE_RANKMAX 的组合来获得不同组的总数(你不能在 window 函数中使用 COUNT(DISTINCT 所以我们需要破解它)
    • 您可以更改此步骤以使用子查询而不是 window 函数。它可能更快或更慢
  • 加入主要 table,并过滤掉任何 ItemID 其不同组的总数与主要总数不同的
SELECT
  t1.ItemID
FROM (
    SELECT *,
      TotalGroups = MAX(dr) OVER ()
    FROM (
      SELECT
        fi.FilterID,
        t2.FilterGroupID,
        dr = DENSE_RANK() OVER (ORDER BY t2.FilterGroupID)
      FROM @Filters fi
      JOIN Table2 t2 ON t2.FilterID = fI.FilterID
    ) fi
) fi
JOIN Table1 t1 ON t1.FilterID = fi.FilterID
GROUP BY
  t1.ItemID
HAVING COUNT(DISTINCT FilterGroupID) = MAX(fi.TotalGroups);

db<>fiddle