【问题标题】:Sql Server - Matching exact ids or moreSql Server - 匹配确切的 id 或更多
【发布时间】:2016-06-06 12:32:20
【问题描述】:

我有一个带有列的"messages" 表:"id""title"

"categories" 包含列的表:"id""title"

"messages_categories" 链接表与列:"message_id","category_id"

假设我们有messages,ID 为

1,2,3

categories,ID 为

1,2,3

messages_categories 的数据为

message: 1, category: 1

message: 2, category: 1

message: 2, category: 2

message: 3, category: 1

message: 3, category: 2

message: 3, category: 3

例如,我想找到完全匹配或更多的匹配项

如果我搜索类别 1,我会收到消息 1、2、3

如果我搜索类别 1,2,我会收到消息 2,3

如果我搜索类别 1、2、3,我只会得到消息 3

我使用了很多 id,所以加入每个类别可能太多了。

我发现我可以将"having" 语句与"sum""count" 一起使用来查找确切的行 但还不够好。

感谢任何帮助,Nevo。

【问题讨论】:

  • 请澄清“我使用了很多 ID,所以加入每个类别可能太多了。”你的意思是你指定了很多类别作为输入?如果是,那么有多少?
  • “完全匹配或更多”毫无意义!但是,从您的示例中,您似乎想要查找给定列表中所有类别中的任何和所有消息 ID?即,给定类别列表 (1,2),您想知道类别 1 和 2 中的所有消息吗?
  • “找到确切的行但还不够好”是什么意思。

标签: sql sql-server tsql


【解决方案1】:

如果您需要“更多”,请使用 NOT EXISTS,即所谓的带提醒的关系除法

SELECT DISTINCT messages_id
FROM messages_categories r1
WHERE NOT EXISTS
       (SELECT *
        FROM 
           (SELECT 1 as cat_id UNION SELECT 2 ) S -- id of categories needed 
        WHERE NOT EXISTS
               (SELECT *
                FROM messages_categories AS r2
                WHERE (r1.messages_id = r2.messages_id)
                   AND (r2.category_id = S.cat_id)));

【讨论】:

    【解决方案2】:

    类似的东西可能会起作用:

    SELECT DISTINCT x.message_id
    FROM (
       **query-that-gives-the-exact-rows-but-isnt-good-enough**
    ) AS x
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多