根据2个表(SQL)

时间:2017-05-04 15:05:30

标签: c# sql-server database

我有以下表格。

表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

感谢任何帮助。我在网上搜索,找不到这种情况的可能解决方案。

3 个答案:

答案 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可以使事情变得容易