SQL查询优化

nvt*_*ang 0 sql t-sql sql-server sql-server-2005

我的SQL查询有问题,需要时间从数据库中获取所有记录.任何身体帮助我.以下是数据库示例:

order(order_id, order_nm)
customer(customer_id, customer_nm)
orderDetail(orderDetail_id, order_id, orderDate, customer_id, Comment)
Run Code Online (Sandbox Code Playgroud)

我想获得最新的客户和订单详细信息.
这可能是解决方案:

我创建了一个GetLatestOrderByCustomer(CusID)函数来获取最新的客户信息.

CREATE FUNCTION [dbo].[GetLatestOrderByCustomer]
(
    @cus_id int
)
RETURNS varchar(255)
AS
BEGIN
    DECLARE @ResultVar varchar(255)

    SELECT @ResultVar = tmp.comment
    FROM 
    (
        SELECT TOP 1 orderDate, comment
        FROM orderDetail
        WHERE orderDetail.customer_id = @cust_id
    ) tmp


    -- Return the result of the function
    RETURN @ResultVar

END
Run Code Online (Sandbox Code Playgroud)

下面是我的SQL查询

SELECT 
      customer.customer_id
    , customer.customer_nm
    , dbo.GetLatestOrderByCustomer(customer.customer_id)
FROM Customer
    LEFT JOIN orderDetail
        ON orderDetail.customer_id = customer.customer_id
Run Code Online (Sandbox Code Playgroud)

运行该功能需要时间.有人可以建议我任何解决方案,使其更好吗?

OMG*_*ies 5

使用:

   SELECT c.customer_id
        , c.customer_nm
        , y.comment
     FROM CUSTOMER c
LEFT JOIN (SELECT od.customer_id,
                  MAX(od.orderdate) AS max_date
             FROM ORDERDETAIL od
         GROUP BY od.customer_id) x ON x.customer_id = c.customer_id
     JOIN (SELECT od.customer_id,
                  od.comment,
                  od.orderdate
             FROM ORDERDETAIL od) y ON y.customer_id = c.customer_id
                                   AND y.orderdate = x.max_date
Run Code Online (Sandbox Code Playgroud)

不需要该函数 - 使用派生表/内联视图/子查询.函数执行不佳的原因是因为它正在为返回的每一行执行.