这个 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