2017-05-04 118 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

這一切都取決於情況。在這個例子中,我會同意你的看法。如果這經常被調用,並且有成千上萬的行,它可能會成爲性能問題,特別是如果沒有索引。 –