【问题标题】:Using data from previous query使用来自先前查询的数据
【发布时间】:2011-11-11 17:06:14
【问题描述】:

我想使用这样的查询

SELECT personId
FROM Person p 
Inner Join address a on p.personId=a.personId
WHERE(a.created > GETDATE() -10)

然后我想用这个数据来过滤这个查询

SELECT * 
FROM accounts a
WHERE a.person /*is in the results of the previous query */

我该怎么做?

【问题讨论】:

    标签: sql sql-server-2008 subquery


    【解决方案1】:

    这应该可以解决问题(假设您的帐户表中有 personId 列)。

    SELECT * 
    FROM accounts a
    WHERE a.personId in (
                    SELECT DISTINCT personId
                    FROM Person p 
                    Inner Join address a on p.personId=a.personId
                    WHERE(a.created > DATEADD(d,-10,GETDATE())))
    

    或者,您可以直接连接 3 个表,而不是使用子查询:

    SELECT
        C.*
    FROM
        accounts C
    INNER JOIN
        Person P ON P.personId = C.personId
    INNER JOIN
        [Address] A ON A.personId = P.PersonId
    WHERE
        A.created > DATEADD(d,-10,GETDATE())
    

    【讨论】:

    • 谢谢,有史以来最快的回复。会试一试
    • 哈哈,你发的帖子一定是刚上网站吧。
    • 这对于 SQL Server 2008 来说不是一个好的答案,因为 CTE 更易于维护/可读,并且受益于 JOIN 子句而不是 IN 子句,但由于它有效,所以没有否决票。
    • 是的,很好的一点:可维护性 - 实际上,我是 CTE 的忠实粉丝,只是试图将我的答案保持在最基本的水平。不过我同意 - CTE 将是这里最优雅的解决方案。
    【解决方案2】:

    SQL Server 2008 中一个不错的功能是公用表表达式 (CTE)。它基本上是一个内联视图,使实际返回数据的查询更易于阅读。

    WITH people
    AS
    (
    SELECT personId
    FROM Person p 
    Inner Join address a on p.personId=a.personId
    WHERE(a.created > GETDATE() -10)
    )
    
    SELECT * 
    FROM accounts a
    INNER JOIN people p ON a.personId = p.personId
    

    【讨论】:

    • 我喜欢这个语法,它的性能如何?你这样做是不是更多地打击了数据库?
    • 性能方面,CTE 是性能中立的。 SQL Server 引擎会将 CTE 内联到一个大型最终查询中,但开发人员更容易调试和维护 - 特别是当您需要按聚合进行 GROUP BY 时。
    【解决方案3】:

    你可以这样做:

    SELECT * 
    FROM accounts a
    WHERE a.person IN 
    (
    SELECT personId
    FROM Person p 
    Inner Join address a on p.personId=a.personId
    WHERE(a.created > GETDATE() -10)
    );
    

    【讨论】:

    • 这对于 SQL Server 2008 来说不是一个好的答案,因为 CTE 更易于维护/可读,并且受益于 JOIN 子句而不是 IN 子句,但由于它有效,所以没有否决票。
    • @HardCode 我主要来自 Oracle 背景 - 你有 CTE 的例子吗?
    • Oracle 也有 CTE。 (与 HardCode 的答案中使用的 WITH 语法相同)
    【解决方案4】:
    begin
    with Results AS
    (
    SELECT *
    FROM Person p 
    Inner Join address a on p.personId=a.personId
    WHERE(a.created > GETDATE() -10)
    )
    END
    
    SELECT * 
    FROM accounts a
    WHERE a.person IN (select person from Results )
    

    【讨论】:

      猜你喜欢
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 2018-05-30
      相关资源
      最近更新 更多