2012-08-10 99 views
3

我想在此查询的值进行更新,但它说,它返回多个值。T-SQL更新与SUM和GROUP BY

UPDATE PO_HEADER 
    SET TOTAL = (SELECT SUM(LINE_TOTAL) AS "NEW_LINE_TOTAL" 
    FROM PO_LINE pl, PO_HEADER ph 
    where ph.IC_PO_HEADER = pl.IC_PO_HEADER 
    and ph.RELEASE_NUMBER = pl.RELEASE_NUMBER 
    group by pl.IC_PO_HEADER,pl.FOREIGN_KEY,ph.RELEASE_NUMBER, 
    ph.REVISION_NUMBER,ph.PO_NUMBER) 
from PO_HEADER ph, PO_LINE pl 
where ph.IC_PO_HEADER = pl.IC_PO_HEADER; 

消息512,级别16,状态1,行1
子查询返回多个值。当子查询遵循=,!=,<,< =,>,> =或当子查询用作表达式时,这是不允许的。

它是如何返回多列多?

+4

它不返回超过1列,它返回多行, – 2012-08-10 21:57:48

回答

9

如果该查询返回的信息,你想:

SELECT *, LINE_TOTAL = SUM(l.LINE_TOTAL) OVER 
    (PARTITION BY l.IC_PO_HEADER, l.RELEASE_NUMBER) 
    FROM dbo.PO_HEADER AS h 
    INNER JOIN dbo.PO_LINE AS l 
    ON h.IC_PO_HEADER = l.IC_PO_HEADER 
    AND h.RELEASE_NUMBER = l.RELEASE_NUMBER; 

那么这可能是你想要的UPDATE查询:

;WITH x AS 
(
    SELECT h.TOTAL, lt = SUM(l.LINE_TOTAL) OVER 
    (PARTITION BY l.IC_PO_HEADER, l.RELEASE_NUMBER) 
    FROM dbo.PO_HEADER AS h 
    INNER JOIN dbo.PO_LINE AS l 
    ON h.IC_PO_HEADER = l.IC_PO_HEADER 
    AND h.RELEASE_NUMBER = l.RELEASE_NUMBER 
) 
UPDATE x SET TOTAL = lt; 

我与戈登同意,您的分组似乎很奇怪。我不确定我是否正确(这就是为什么我强烈建议你先运行SELECT)。

+0

我正在与update语句“关键字‘集团’附近有语法错误”。为了测试,我已经创建表: 创建表PO_HEADER(TOTAL INT,IC_PO_HEADER INT,发行编号INT) 创建表PO_LINE(LINE_TOTAL INT,IC_PO_HEADER INT,发行编号INT) – 2013-08-27 14:31:16

+1

@Ian我不能调试你的查询,如果我能看不到,对不起。 – 2013-08-27 14:42:17

+0

感谢您的注意。运行更新语句时(在运行上面的“create table”语句之后)会发生错误。 – 2013-08-28 09:34:28

8

因为子查询选择将返回多行它返回一个以上的列。

说不定你指的更多的东西是这样的:

with toupdate as (
    SELECT SUM(LINE_TOTAL) AS "NEW_LINE_TOTAL" 
    FROM PO_LINE pl join 
      PO_HEADER ph 
      on ph.IC_PO_HEADER = pl.IC_PO_HEADER and 
      ph.RELEASE_NUMBER = pl.RELEASE_NUMBER 
    group by pl.IC_PO_HEADER, pl.FOREIGN_KEY, ph.RELEASE_NUMBER, 
       ph.REVISION_NUMBER, ph.PO_NUMBER 
    ) 
UPDATE PO_HEADER 
    SET TOTAL = toupdate. New_Line_Total 
    from toupdate 
    where PO_HEADER.IC_PO_HEADER = toupdate.IC_PO_HEADER; 

我仍然怀疑这一点,虽然,因为你是在子查询中5场分组,但只有在加入其中的一个。在这种情况下,我希望“toupdate”只能在ic_po_header上进行分组。