Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用聚合函数更新_Sql_Sql Server - Fatal编程技术网

Sql 使用聚合函数更新

Sql 使用聚合函数更新,sql,sql-server,Sql,Sql Server,我正在尝试使用下面的查询更新表的一列。。但我犯了个错误 聚合不能出现在UPDATE语句的集合列表中 代码: 我想用表2中b.date列中b.code为“in”的最早日期更新表中的InDate列 这里出了什么问题?您需要将聚合放在临时表或子查询中,并且需要显式的GROUPBY语句 UPDATE Test.dbo.Table1 SET InDate = min_date FROM Test.dbo.Table1 c inner join (SELECT a.id1, MIN(b.D

我正在尝试使用下面的查询更新表的一列。。但我犯了个错误

聚合不能出现在UPDATE语句的集合列表中

代码:

我想用表2中b.date列中b.code为“in”的最早日期更新表中的InDate列


这里出了什么问题?

您需要将聚合放在临时表或子查询中,并且需要显式的GROUPBY语句

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语句中使用该日期:

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

不完全确定你在这里想做什么。这将更新整个表1。我怀疑您还想做其他事情,但我不知道您想做什么。我只想用表2中最早的日期值更新表中的InDate列,因此表2中的code列应该等于“in”
--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