SQL 查询提供与多个列匹配的不同结果
抱歉,我无法为我的问题提供更好的标题,因为我对 SQL 还很陌生。 我正在寻找一个可以解决以下问题的 SQL 查询字符串。
让我们假设如下表:
DOCUMENT_ID | TAG ---------------------------- 1 | tag1 1 | tag2 1 | tag3 2 | tag2 3 | tag1 3 | tag2 4 | tag1 5 | tag3
现在我想选择包含一个或多个标签的所有不同文档 ID(但这些标签必须提供所有指定的标签)。 例如: 选择所有带有 tag1 和 tag2 的 document_id 将返回 1 和 3(但不会返回 4,因为它没有 tag2)。
最好的方法是什么?
问候, 凯
Sorry, I couldn't provide a better title for my problem as I am quite new to SQL.
I am looking for a SQL query string that solves the below problem.
Let's assume the following table:
DOCUMENT_ID | TAG ---------------------------- 1 | tag1 1 | tag2 1 | tag3 2 | tag2 3 | tag1 3 | tag2 4 | tag1 5 | tag3
Now I want to select all distinct document id's that contain one or more tags (but those must provide all specified tags).
For example:
Select all document_id's with tag1 and tag2 would return 1 and 3 (but not 4 for example as it doesn't have tag2).
What would be the best way to do that?
Regards,
Kai
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
根据需要调整 N 和标签列表。
Adjust N and the tag list as needed.
如何在 where 子句中生成标记列表取决于您的应用程序结构。 如果您将动态生成查询作为代码的一部分,那么您可以简单地将查询构造为动态生成的大字符串。
我们总是使用存储过程来查询数据。 在这种情况下,我们将标签列表作为 XML 文档传递。 - 这样的过程可能看起来像其中一个,其中输入参数为
OR
END
How you generate the list of tags in the where clause depends on your application structure. If you are dynamically generating the query as part of your code then you might simply construct the query as a big dynamically generated string.
We always used stored procedures to query the data. In that case, we pass in the list of tags as an XML document. - a procedure like that might look something like one of these where the input argument would be
OR
END
编辑:
因缺乏约束而更新...
Edit:
Updated for lack of constraints...
这假设 DocumentID 和 Tag 是主键。
编辑:更改 HAVING 子句以计算 DISTINCT 标记。 这样主键是什么并不重要。
测试数据
查询
结果
This assumes DocumentID and Tag are the Primary Key.
Edit: Changed HAVING clause to count DISTINCT tags. That way it doesn't matter what the primary key is.
Test Data
Query
Results