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)
运行该功能需要时间.有人可以建议我任何解决方案,使其更好吗?
使用:
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)
不需要该函数 - 使用派生表/内联视图/子查询.函数执行不佳的原因是因为它正在为返回的每一行执行.
归档时间: |
|
查看次数: |
153 次 |
最近记录: |