簡體   English   中英

使用匯總功能更新

[英]Updating Using Aggregate Function

我正在嘗試使用以下查詢更新表的列。.但是出現錯誤

聚合可能不會出現在UPDATE語句的設置列表中

碼:

UPDATE Test.dbo.Table1
    SET InDate = MIN(b.Date)        
FROM
    Test.dbo.Table1 a
    LEFT OUTER JOIN
    Test.dbo.Table2 b
    ON
        a.ID1 = b.ID2
        WHERE b.Code = 'IN';

我想用表2中的最早日期更新表中的InDate列(b.Date)列,其中(b.code)為'IN'

這是怎么了

您需要將聚合放入臨時表或子查詢中,並且需要顯式的GROUP BY語句。

UPDATE Test.dbo.Table1 
SET InDate = min_date
FROM Test.dbo.Table1  c inner join   
    (SELECT a.id1, MIN(b.Date) min_date
    FROM Test.dbo.Table1 a 
    LEFT OUTER JOIN Test.dbo.Table2 b 
     ON a.ID1 = b.ID2 
    Group by a.id1) d
 ON c.ID1 = d.ID1
WHERE c.Code = 'IN';

認為這會做您想要的。 我刪除了別名以使其盡可能清晰:

UPDATE Table1
SET InDate = (
  SELECT MIN(Table2.Date)
  FROM Table2
  WHERE Table1.ID1 = Table2.ID2
    AND Table2.Code = 'IN'
)

您可以使用apply獲取最小日期,然后在更新語句中使用它:

UPDATE a
    SET a.InDate = b.MinBDate
FROM Table1 a
OUTER APPLY
(    
    SELECT MIN(b.InDate) MinBDate
    FROM Table2 b
    WHERE b.Id = a.Id
        AND b.Code = 'IN'
) b

也許這個嗎?

UPDATE Test.dbo.Table1
    SET InDate = b.Date      
FROM
    Test.dbo.Table1 a
   INNER JOIN (
    select
        b.ID2,
        MIN(b.Date) Date
    from Test.dbo.Table2 b
    where
         WHERE b.Code = 'IN'
    group by
        b.ID2
    ) b
    ON
        a.ID1 = b.ID2

假設您的數據模型類似於以下內容,則可以將其連接到派生表上:

--Data Setup:
DECLARE @Table1 TABLE (ID1 INT, InDate DATETIME)
DECLARE @Table2 TABLE (ID2 INT, ID1 INT, Date DATETIME, Code VARCHAR(12))

INSERT INTO @Table1 (ID1)
VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)

INSERT INTO @Table2 (ID2, ID1, Date, Code)
VALUES
(1, 1, '1/1/2014', 'OUT'),
(2, 1, '5/1/2014', 'IN'),
(3, 1, '3/1/2013', 'IN'),
(4, 2, '1/1/2014', 'OUT'),
(5, 2, '1/1/2014', 'IN'),
(6, 3, '1/1/2014', 'IN'),
(7, 4, '1/1/2014', 'IN'),
(8, 5, '1/1/2014', 'IN'),
(9, 6, '2/1/2014', 'OUT'),
(10, 7, '3/1/2014', 'IN'),
(11, 8, '4/1/2014', 'IN'),
(12, 9, '2/1/2014', 'IN'),
(12, 9, '2/1/2014', 'IN'),
(12, 10, '1/2/2014', 'IN'),
(12, 10, '1/3/2014', 'IN'),
(12, 10, '1/4/2014', 'IN'),
(12, 10, '1/1/2014', 'OUT')

--Actual Update:
UPDATE T1
SET InDate = T2.MinDate
FROM @Table1 T1 
    JOIN (SELECT T2.ID1, MIN(Date) AS MinDate
            FROM @Table2 T2
                WHERE T2.Code = 'IN'
            GROUP BY T2.ID1) T2 ON T2.ID1 = T1.ID1
--Results
SELECT *
FROM @Table1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM