T-SQL - 根据其他相关记录的值获取记录列表

3

我正在尝试进行查询并需要一些帮助(SQL Server)。

想象以下场景:用户正在查看一个包含多个相关类别的网页。根据某些规则,如果特定类别已与另一个类别组合,则不应显示该页面。

为此,我有两个表:

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语句中。非常感谢。


你对规则表的解释与列名不一致。 - Dan Bracuk
如果您将“Pk”替换为“PageId”,那将会很有帮助。通常,“Pk”代表主键,但显然在您的数据中不是这种情况。 - Giorgos Betsos
1个回答

4
您可以使用以下查询来识别与冲突类别相关的页面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 ....)

Demo here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接