我有以下表格。
表1
Id | Values | Counts
1 | rock | 0
2 | tina | 0
3 | alex | 0
表2
Id | Values
1 | rock
2 | alex
3 | alex
4 | rock
5 | rock
6 | tina
如您所见,表1包含值为rock,tina和alex。这些列始终具有唯一值。计数栏应该检查“摇滚”的数量。在表2中,并在Counts列中更新它。例如在表2中显示了3次岩石。岩石的数量应该是3。
与其他值类似。有人请允许我知道如何使用SQL实现这一目标。以下是决赛桌的样子。
表1
Id | Values | Counts
1 | rock | 3
2 | tina | 1
3 | alex | 2
感谢任何帮助。我在网上搜索,找不到这种情况的可能解决方案。
答案 0 :(得分:1)
在SQL Server中,使用相关子查询:
update t1
set t1.Counts = (
select count(*)
from t2
where t2.[Values] = t1.[Values]
);
rextester演示:http://rextester.com/SBYNB72372
在MySQL中,使用相关子查询:
update t1
set t1.Counts = (
select count(*)
from t2
where t2.`Values` = t1.`Values`
);
rextester演示:http://rextester.com/DDDC21719
尽管可以在view
中更好地计算此类内容,而不是存储在t1
表中。
在SQL Server中:
create view dbo.t1_with_counts as
select t1.Id, t1.[Values], count(t2.[Values]) as Counts
from t1
left join t2
on t1.[Values] = t2.[Values]
group by t1.Id, t1.[Values]
go
select *
from dbo.t1_with_counts;
在MySQL中:
create view t1_with_counts as
select t1.Id, t1.`Values`, count(t2.`Values`) as Counts
from t1
left join t2
on t1.`Values` = t2.`Values`
group by t1.Id, t1.`Values`;
select *
from t1_with_counts;
答案 1 :(得分:1)
我会质疑在这样的表格中跟踪计数的智慧。这导致关系数据库结构和管理不良。相反,我建议您从表1中删除count
列。然后,只要您需要查看计数,就可以使用视图:
SELECT t1.ID, t1.VALUES, COUNT(t2.ID) AS VALUE_COUNT
FROM TABLE1 t1 LEFT JOIN TABLE2 t2 ON t1.VALUES = t2.VALUES
这会导致动态更新您的数据视图,而不是静态视图,如果没有您的意识,它可能会过时。
答案 2 :(得分:1)
您通常可以在2个表之间使用JOIN
来使用Table2中的值更新Table1(如果您使用 bridge 表,则更进一步)。
UPDATE t1
SET t1.dataColumn = t2.dataColumn
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.keyColumn = t2.keyColumn
但是,当您使用聚合函数(例如Count,Sum)时,必须使用第二个表的子查询并执行对该子查询的JOIN
UPDATE t1
SET t1.Counts = sb.Counts
FROM Table1 AS t1
INNER JOIN (
SELECT [values], Counts = Count([values])
FROM Table2
GROUP BY [values]
) AS sb
ON t1.[values] = sb.[values]
在你的桌子上运行这个给了我:
SELECT * FROM Table1
id values counts
---- ------- -------
1 rock 3
2 tina 1
3 alex 2
关于你的桌子设计的一件事;我通常建议在命名表,列或其他数据库对象时不要使用保留/特殊/关键字。我还试图避免使用通用名称 id ,因为当你开始将表链接到另一个时它会变得混乱,即使idTable1可以使事情变得容易