在SQL Server中更新具有当前行的id值的列

时间:2015-05-20 09:11:25

标签: sql sql-server sql-update

我需要设置如下的查询:

UPDATE A
    SET Column = (CASE WHEN (Select COUNT(*) from A, B
                             where A.Id = B.Id ) > 0 THEN 1
                       WHEN (Select COUNT(*) from A, B
                             where A.Id = B.bId ) > 10 THEN 2
                  END)

我需要使用表中当前行的id值来执行此操作。但我不知道如何获得这个价值。 这段代码

SELECT COUNT(*) FROM A, B
WHERE A.Id = B.Id 

返回所有行的结果,但我需要当前行的结果。

我使用SQL Server

2 个答案:

答案 0 :(得分:0)

我认为(如果我已正确理解您的要求),以下内容将适用于您

  UPDATE upd
     SET upd.[Column] = case when inlineTbl.CountResult  > 10 then 2
                             else 1 end
    FROM A upd
   INNER JOIN ( SELECT a.ID, COUNT(*) as CountResult
                  FROM A 
                 INNER JOIN B on A.Id = B.Id 
                 GROUP BY A.ID  -- Missed this earlier.
              ) inlineTbl on upd.Id = inlineTbl.Id

编辑:只是为了解释:我所做的是使用带有连接的更新语句,用于计算表B中每个A.ID值出现的时间的内联表。

编辑:发现您已将第二个WHEN条件更改为> 10,因此更新了我的示例以反映这一点。

答案 1 :(得分:0)

如果我找到你,你想要计算Bif count > 10中的相应行,然后用A更新if count > 0,然后用A更新DECLARE @a TABLE ( id INT, c INT ) DECLARE @b TABLE ( id INT ) INSERT INTO @a VALUES ( 1, NULL ), ( 2, NULL ), ( 3, NULL ) INSERT INTO @b VALUES ( 2 ), ( 3 ), ( 3 ), ( 3 ), ( 3 ), ( 3 ), ( 3 ), ( 3 ), ( 3 ), ( 3 ), ( 3 ), ( 3 ), ( 3 ), ( 3 ), ( 3 ) UPDATE a SET c = CASE WHEN b.c > 10 THEN 2 WHEN b.c > 0 THEN 1 END FROM @a a JOIN ( SELECT a.id , COUNT(*) AS c FROM @a a JOIN @b b ON b.id = a.id GROUP BY a.id ) b ON a.id = b.id SELECT * FROM @a 1,否则不要更新。这就是你需要的:

id  c
1   NULL
2   1
3   2

输出:

WITH    cte
          AS ( SELECT   a.* ,
                        COUNT(*) OVER ( PARTITION BY b.id ) co
               FROM     @a a
                        JOIN @b b ON b.id = a.id
             )
    UPDATE  cte
    SET     c = CASE WHEN co > 10 THEN 2
                     WHEN co > 0 THEN 1
                END

这只是另一个版本:

io.on('connection', function (socket) {
            console.log("connected");

});