基于2个表中列的比较的更新表列(SQL)
我有以下表格。基于2个表中列的比较的更新表列(SQL)
表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中包含的值作为摇滚,Tina和亚历克斯。这些列将始终具有唯一值。 Counts列应检查表2中'rock'的计数并在Counts列中更新它。例如,岩石在表2中显示3次。岩石的计数应为3.
对于其他值也是如此。有人可以让我知道如何使用SQL来实现这一点。以下是决赛桌的外观。
表1
Id | Values | Counts
1 | rock | 3
2 | tina | 1
3 | alex | 2
任何帮助理解。我在网上搜索,无法找到这种情况的可能解决方案。
您可以使用一般一个表2 JOIN
之间从表2与值更新表1(或进一步,如果你使用的是桥表)。
UPDATE t1
SET t1.dataColumn = t2.dataColumn
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.keyColumn = t2.keyColumn
然而,当使用的是骨料功能(如计数,总和),则必须使用用于所述第二表的子查询并执行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可以使事情变得更容易,它可能会引起混淆
在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中删除count
列。然后,当你需要看你计数使用视图:
SELECT t1.ID, t1.VALUES, COUNT(t2.ID) AS VALUE_COUNT
FROM TABLE1 t1 LEFT JOIN TABLE2 t2 ON t1.VALUES = t2.VALUES
这将导致你的数据的动态更新视图,而不是一个静态认为,如果您没有意识到它有可能会过时。
这一切都取决于情况。在这个例子中,我会同意你的看法。如果这经常被调用,并且有成千上万的行,它可能会成为性能问题,特别是如果没有索引。 –
MySQL或SQL Server? – ollie
SQL Server ollie .. – Rihana