这个 SQL 更新语句有什么问题
Whats wrong with this SQL update statement
我在我的订单 table 中添加了一个 "FirstDesignTitle" 列,并尝试更新其初始值(然后通过业务逻辑使其保持最新)。我的 table 是:
Orders
------
OrderID
FirstDesignTitle
LineItem
--------
LineItemID
OrderID
DesignID
Design
------
DesignID
DesignTitle
"First" 表示具有 DesignID(该列可为空)的最低 LineItemID 的 LineItem。我得到的更新语句是:
UPDATE Orders
SET FirstDesignTitle = t.DesignTitle
FROM (
SELECT TOP (1) [t4].[value] as DesignTitle
FROM (
SELECT (
SELECT [t3].[DesignTitle]
FROM (
SELECT TOP (1) [t1].[DesignID]
FROM [dbo].[LineItem] AS [t1]
WHERE ([t1].[DesignID] IS NOT NULL) AND ([t1].[OrderID] = [t0].[OrderID])
ORDER BY [t1].[LineItemID] ASC
) AS [t2]
LEFT OUTER JOIN [dbo].[Design] AS [t3] ON [t3].[DesignID] = [t2].[DesignID]
) AS [value], [t0].[OrderID]
FROM [dbo].[Orders] AS [t0]
) AS [t4]
WHERE [t4].[OrderID] = orderid
ORDER BY DesignTitle DESC
) t
但是,我只得到一个 DesignTitle 来填充所有订单,而不是我想要的,即为每个订单显示其第一个 LineItem 的 DesignTitle。填充的 DesignTitle 是设计 table 中最后一个 DesignTitle,以字母 "ZZZ" 开头。谁能describe/fix我做错了什么?
我不知道为什么您的查询不起作用。另一种方法使用相关子查询:
update orders
set firstdesigntitle = (select top 1 d.designtitle
from lineitem li join
design d
on li.designid = d.designid
where li.orderid = orders.orderid
order by d.designid asc
);
您没有指定 "first" 是如何定义的。这使用最小的 designid
.
这是一种使用 CTE 实现您想要的效果的方法
;WITH CTELineItem
AS
(
SELECT Sequence = ROW_NUMBER() OVER(PARTITION BY OrderID ORDER BY LineItemID ASC),
OrderID,
DesignID
FROM LineItem
WHERE DesignID IS NOT NULL
)
UPDATE Orders
SET Orders.FirstDesignTitle = Design.DesignTitle
FROM Orders
INNER JOIN CTELineItem AS FirstLineItem ON FirstLineItem.Sequence = 1
AND Orders.OrderID = FirstLineItem.OrderID
INNER JOIN Design ON FirstLineItem.DesignID = Design.DesignID
我在我的订单 table 中添加了一个 "FirstDesignTitle" 列,并尝试更新其初始值(然后通过业务逻辑使其保持最新)。我的 table 是:
Orders
------
OrderID
FirstDesignTitle
LineItem
--------
LineItemID
OrderID
DesignID
Design
------
DesignID
DesignTitle
"First" 表示具有 DesignID(该列可为空)的最低 LineItemID 的 LineItem。我得到的更新语句是:
UPDATE Orders
SET FirstDesignTitle = t.DesignTitle
FROM (
SELECT TOP (1) [t4].[value] as DesignTitle
FROM (
SELECT (
SELECT [t3].[DesignTitle]
FROM (
SELECT TOP (1) [t1].[DesignID]
FROM [dbo].[LineItem] AS [t1]
WHERE ([t1].[DesignID] IS NOT NULL) AND ([t1].[OrderID] = [t0].[OrderID])
ORDER BY [t1].[LineItemID] ASC
) AS [t2]
LEFT OUTER JOIN [dbo].[Design] AS [t3] ON [t3].[DesignID] = [t2].[DesignID]
) AS [value], [t0].[OrderID]
FROM [dbo].[Orders] AS [t0]
) AS [t4]
WHERE [t4].[OrderID] = orderid
ORDER BY DesignTitle DESC
) t
但是,我只得到一个 DesignTitle 来填充所有订单,而不是我想要的,即为每个订单显示其第一个 LineItem 的 DesignTitle。填充的 DesignTitle 是设计 table 中最后一个 DesignTitle,以字母 "ZZZ" 开头。谁能describe/fix我做错了什么?
我不知道为什么您的查询不起作用。另一种方法使用相关子查询:
update orders
set firstdesigntitle = (select top 1 d.designtitle
from lineitem li join
design d
on li.designid = d.designid
where li.orderid = orders.orderid
order by d.designid asc
);
您没有指定 "first" 是如何定义的。这使用最小的 designid
.
这是一种使用 CTE 实现您想要的效果的方法
;WITH CTELineItem
AS
(
SELECT Sequence = ROW_NUMBER() OVER(PARTITION BY OrderID ORDER BY LineItemID ASC),
OrderID,
DesignID
FROM LineItem
WHERE DesignID IS NOT NULL
)
UPDATE Orders
SET Orders.FirstDesignTitle = Design.DesignTitle
FROM Orders
INNER JOIN CTELineItem AS FirstLineItem ON FirstLineItem.Sequence = 1
AND Orders.OrderID = FirstLineItem.OrderID
INNER JOIN Design ON FirstLineItem.DesignID = Design.DesignID