如何在 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语句汇总——聚合函数分组子查询及组合查询

使用 sql union 子查询组合来处理客户过滤的 AND/OR 条件组合

SQL 查询时间复杂度 - 连接与子查询

流分析:源“子查询”只能用于使用“datediff”函数的时间谓词

BigQuery SQL:将视图 A 中的子查询作为嵌套表嵌入视图 B