我需要设置如下的查询:
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
答案 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)
如果我找到你,你想要计算B
和if 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");
});