【问题标题】:subquery to retrieve a query检索查询的子查询
【发布时间】:2016-06-28 04:53:12
【问题描述】:

我的Sales.Customer 表包括以下列:

  • 客户 ID(整数)
  • 名字 (nvarchar(50))
  • 姓氏 (nvarchar(50))

我的Sales.SalesOrder 表包括以下列:

  • SalesOrderNumber(整数)
  • OrderDate(日期)
  • 客户 ID(整数)
  • 金额(金钱)

一些客户在过去几年中下了多个订单。我编写了以下查询来检索每个客户下订单的最后日期:

SELECT c.CustomerID, c.FirstName, c.LastName,
            -- correlated subquery goes here
               AS LastOrderDate
FROM Sales.Customer AS c;

为什么我的子查询没有完成我的实际查询?我错过了什么还是应该有所不同?

(SELECT MAX(o.OrderDate)
    FROM Sales.SalesOrder AS o
    WHERE o.CustomerID = c.CustomerID)

我考虑过我的解决方案是否过于复杂,所以也许这应该可行?

  (SELECT MAX(c.OrderDate)
    FROM Sales.Customer AS c) 

【问题讨论】:

  • 这是哪个 - mysqlsql-server
  • 抱歉,准确的说是sql-server,trans-sql,我只是觉得把mysql的标签加进去会吸引更多的用户看到。我会立即删除它,因为它肯定会影响声誉。
  • 好的。我不明白“为什么我的子查询没有完成我的实际查询?”是什么意思——你的第一个子查询应该可以工作(不是你的第二个)。
  • 请发布您需要帮助的确切查询;以及一些示例数据和所需的结果。
  • 应该可以工作.. 你应该加入 2 个表并使用 group by

标签: sql-server tsql


【解决方案1】:

您应该能够像这样将其重写为 CTE。

;WITH LastOrderDate AS
(
    SELECT CustomerID,MAX(OrderDate) AS LastOrderDate
    FROM Sales.SalesOrder
    GROUP BY CustomerID

)
SELECT c.CustomerID, c.FirstName, c.LastName, LastOrderDate
               AS LastOrderDate
FROM Sales.Customer AS c
LEFT JOIN LastOrderDate l
ON c.CustomerID = l.CustomerID;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 2018-05-08
    相关资源
    最近更新 更多