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

标签 sql sql-server tsql

我正在尝试进行查询并需要一些帮助 (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 ....)

Demo here

关于sql - T-SQL - 根据其他相关记录值获取记录列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32523352/

相关文章:

java - 在核心java中,从用户获取输入并将其插入mysql数据库时,显示错误sql错误

mysql - 找到用户的排名位置

sql - 你如何排除未知数?

sql-server - 微软 SQL : How are variables and aliases evaluated within query execution?

sql-server - SSMS : Unable to show XML in the SSMS Explorer

sql-server - 在存储的 proc 参数中处理超过 8000 个字符

sql-server - SQL查找最长序列

mysql - 何时在 MySQL 中使用单引号、双引号和反引号

c# - DBMigrator 无法首先读取 ef6 代码中的访问 token - SQL 连接

sql - SQL中的偶数或奇数