如何在 SQL 中组合两个查询? (子查询)
Posted
技术标签:
【中文标题】如何在 SQL 中组合两个查询? (子查询)【英文标题】:How to combine two queries in SQL? (subquery) 【发布时间】:2021-12-30 16:41:06 【问题描述】:问题
我无法将两个 SQL 查询合二为一。我想使用第一个查询中的部分数据来访问另一个表并检索更多信息。
说明
我有以下查询,可获取标题中包含“html”一词的前 50 个 *** 帖子:
SELECT top 50
Id AS [Post Link],
Title,
Score,
OwnerUserId
FROM Posts
WHERE Title LIKE lower('%html%')
ORDER BY
Score DESC
当我检索到这些数据后,我想获取 50 个 OwnerUserId 并查询 Users 表中的 AboutMe,并将其与“主查询”的结果一起显示。据我了解,这可以使用子查询来实现,但我不太确定如何。我想做的是:
SELECT AboutMe
FROM Users
WHERE Id = OwnerUserId (having taken the OwnerUserId from the first query)
非常感谢任何帮助
【问题讨论】:
x like lower('%abc%')
与x like '%abc%'
相同,但与lower(x) like '%abc%'
不同
【参考方案1】:
我不认为你想要一个可能看起来像这样的子查询
SELECT AboutMe
FROM Users
WHERE Id in
(
SELECT top 50
OwnerUserId
FROM Posts
WHERE Title LIKE lower('%html%')
ORDER BY
Score DESC
)
我认为您确实希望一个查询通过连接两个表来返回所有结果,例如像
SELECT top 50
Posts.Id AS [Post Link],
Posts.Title,
Posts.Score,
Posts.OwnerUserId,
Users.AboutMe
FROM Posts
Inner join users on users.id = Posts.OwnerUserId
WHERE Title LIKE lower('%html%')
ORDER BY
Posts.Score DESC
【讨论】:
【参考方案2】:您没有提到您使用的是什么 DBMS,但通常您可以使用 IS IN
之类的东西。请参阅 PostgreSQL 文档中的 example。将它与 LIMIT
结合起来,它应该会产生您正在寻找的东西。
最终的查询看起来像
SELECT aboutme
FROM users
WHERE id IN (
SELECT owneruserid
FROM posts
WHERE title LIKE LOWER('%html%')
ORDER BY score DESC
LIMIT 50
)
您也可以使用CTE 而不是将子查询放在 WHERE 语句中以获得更好的可读性。
还取决于您希望如何处理一个用户有两个前 50 个帖子的情况,您需要在查询中添加一个 DISTINCT 以仅获取唯一的 user_ids
【讨论】:
它在data.stackexchange.com上并且是T-SQL T-SQL 应该具有相同的语法,请参见此处:docs.microsoft.com/de-de/sql/t-sql/language-elements/…【参考方案3】:试试这个查询,
SELECT AboutMe
FROM Users
WHERE Id in
(
SELECT top 50 OwnerUserId
FROM Posts
WHERE Title LIKE lower('%html%')
ORDER BY Score DESC
)
【讨论】:
以上是关于如何在 SQL 中组合两个查询? (子查询)的主要内容,如果未能解决你的问题,请参考以下文章
使用 sql union 子查询组合来处理客户过滤的 AND/OR 条件组合