我正在尝试进行查询并需要一些帮助 (SQL Server)。
想象一下以下场景:用户正在查看一个网页,其中包含多个相关类别。根据某些规则,如果特定类别已与另一个类别放在一起,则不应显示该页面。
为此我有 2 个表:
1) 具有页面 ID 和相关类别:
Pk CategoryNumber
--------------------
1 30
1 31
1 45
2 30
3 21
3 26
3 64
4 25
4 12
5 25
5 31
5 30
5 45
2) 规则表。第一行表示:当查看具有类别 30 的页面时,如果它也具有 45 类别,则不应检索它。
WhenViewingCategoryNumber HideEverythingWithCategoryNumber
-------------------------------------------------------
30 45
25 31
预期输出:
2
3
4
我已经花了几个小时解决这个问题,我哪儿也不去,所以如果有人能提供帮助,我将不胜感激。如果可能的话,最好使用 SELECT 语句将其直接集成到更大的 CTE 语句中。非常感谢。
最佳答案
您可以使用以下查询来识别那些与冲突类别相关的页面 ID:
SELECT DISTINCT c1.PageId
FROM Categories AS c1
INNER JOIN Rules AS r ON c1.ItemNumber = r.WhenViewingCategoryNumber
INNER JOIN Categories AS c2 ON c1.PageId = c2.PageId
AND r.HideEverythingWithCategoryNumber = c2.ItemNumber
这将返回:
PageId
------
1
5
现在您只需使用NOT IN
即可获得预期的结果:
SELECT DISTINCT PageId
FROM Categories
WHERE PageId NOT IN ( ... above query here ....)
关于sql - T-SQL - 根据其他相关记录值获取记录列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32523352/