2017-05-04 117 views
3

我有以下表格。基于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

MySQL或SQL Server? – ollie

+0

SQL Server ollie .. – Rihana

回答

1

您可以使用一般一个表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可以使事情变得更容易,它可能会引起混淆

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中删除count列。然后,当你需要看你计数使用视图:

SELECT t1.ID, t1.VALUES, COUNT(t2.ID) AS VALUE_COUNT 
FROM TABLE1 t1 LEFT JOIN TABLE2 t2 ON t1.VALUES = t2.VALUES 

这将导致你的数据的动态更新视图,而不是一个静态认为,如果您没有意识到它有可能会过时。

+0

这一切都取决于情况。在这个例子中,我会同意你的看法。如果这经常被调用,并且有成千上万的行,它可能会成为性能问题,特别是如果没有索引。 –