基于另一个表中的列值的更新表
问题描述:
我有以下表格。基于另一个表中的列值的更新表
表1
Id | Data | Values
1 | rfsd | 23
2 | fghf | 45
3 | rhhh | 23
表3
Id | Data | Values
1 | rfsd | 23
2 | tfgy | 23
表2
Id | Fields | Counts
1 | 23 | 0
2 | 45 | 0
正如你可以看到,计数字段的值为0我想看 '字段' 列在表2中,然后与表1和表3中的'值'列进行比较,并在'值'字段中存在该值时增加计数。
最终的结果应该显示像这样
Table 2
Id | Fields | Counts
1 | 23 | 4
2 | 45 | 1
这将是数自23出现四次,45在“价值”表1和表的字段出现一次3.
灿有人请让我知道如何为此编写存储过程。
我已经实现了这样的东西。
WITH t1 AS (
SELECT VALUES, COUNT(*) AS Count2 FROM Table1 GROUP BY VALUES)
UPDATE t2
SET t2.Counts = t1.Count2
FROM Table2 t2
JOIN t1 ON t2.Fields=t1.Values;
WITH t3 AS (SELECT VALUES, COUNT(*) AS Count3 FROM Table3 GROUP BY VALUES)
UPDATE t2
SET t2.Counts = t3.Count2
FROM
Table2 t2
JOIN t3 ON t2.Fields=t3.Values;
当我使用这个存储过程时,它将基于t1表更新t2,然后使用t3表覆盖表t2。
我希望t1和t3列在t2表上同时更新。任何想法如何纠正这个存储过程。
答
您可以使用UNION ALL
到组两个表1和3一起(UNION ALL
如果你想不交,UNION
如果你想删除重复的)
WITH t13 AS (
SELECT Id, Data, [Values]
FROM Table1
UNION ALL
SELECT Id, Data, [Values]
FROM Table3
), cte AS (
SELECT
[Values],
COUNT(*) AS Count2
FROM t13
GROUP BY
[Values]
)
UPDATE t2
SET Counts = cte.Count2
FROM
Table2 t2 JOIN cte ON t2.Fields = cte.[Values];
答
希望这会有所帮助。
SELECT t2.Id, t2.Fields, COUNT(1) Counts
FROM Table2 t2
LEFT JOIN Table1 t1 ON t2.Fields = t1.[Values]
LEFT JOIN Table3 t3 ON t2.Fields = t3.[Values]
GROUP BY t2.Id, t2.Fields
如果您需要更新表2,使用以下命令: -
WITH Results AS (
SELECT t2.Id, COUNT(1) Counts
FROM Table2 t2
LEFT JOIN Table1 t1 ON t2.Fields = t1.[Values]
LEFT JOIN Table3 t3 ON t2.Fields = t3.[Values]
GROUP BY t2.Id
)
UPDATE t
SET Counts = r.Counts
FROM Table2 t
JOIN Results r ON t.Id = r.Id;
它说,由多个部分组成的标识符“cte.Count2”无法绑定。任何我误会? –
@AduRao固定。 UPDATE中JOIN中的表应该是cte而不是t13。 – DVT
@AduRao我不认为这是要求upvote的正确方法。 http://meta.stackoverflow.com/questions/255583/what-can-i-do-when-getting-we-are-no-longer-accepting-questions-answers-from-th – DVT