2017-05-04 13 views
3

Ich habe die folgenden Tabellen.Update-Tabelle Spalte basierend auf dem Vergleich von Spalten aus 2 Tabelle (SQL)

Tabelle 1

Id | Values | Counts 
1 | rock | 0 
2 | tina | 0 
3 | alex | 0 

Tabelle 2

Id | Values 
1 | rock 
2 | alex 
3 | alex 
4 | rock 
5 | rock 
6 | tina 

Wie Sie sehen können, Tabelle 1 enthält Werte wie Rock, tina und alex. Diese Spalte hat immer eindeutige Werte. Die Spalte "Counts" sollte die Anzahl von "Rock" in Tabelle 2 überprüfen und sie in der Spalte "Counts" aktualisieren. für z.B. Rock wird 3 mal in Tabelle 2 gezeigt. Die Counts für Rock sollten dann 3 sein.

Ähnlich für andere Werte. Kann mir jemand bitte sagen, wie ich das mit SQL erreichen kann. So sollte der Final Table aussehen.

Tabelle 1

Id | Values | Counts 
1 | rock | 3 
2 | tina | 1 
3 | alex | 2 

Jede Hilfe sehr geschätzt wird. Ich suchte online und konnte keine mögliche Lösung für dieses Szenario finden.

+2

MySQL oder SQL Server? – ollie

+0

SQL Server Ollie .. – Rihana

Antwort

1

Sie können generell eine JOIN zwischen 2 Tabellen verwenden, um Tabelle1 mit Werten aus Tabelle2 zu aktualisieren (oder weiter, wenn Sie Brücke Tabellen verwenden).

UPDATE t1 
SET t1.dataColumn = t2.dataColumn 
FROM Table1  t1 
INNER JOIN Table2 t2 ON t1.keyColumn = t2.keyColumn 

Wenn Sie jedoch Aggregate Funktionen verwenden (wie Count, Sum) müssen Sie eine Unterabfrage für die zweite Tabelle nutzen und auf diese Unterabfrage

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] 

Ausführen dieses auf das JOIN ausführen Ihre Tabellen gaben mir das:

SELECT * FROM Table1 

id values counts 
---- ------- ------- 
1  rock  3 
2  tina  1 
3  alex  2 

Eine Sache, die Ihren Tischentwurf betrifft; Ich empfehle generell, bei der Benennung von Tabellen, Spalten oder anderen Datenbankobjekten keine reservierten/speziellen/Schlüsselwörter zu verwenden. Ich versuche auch zu vermeiden, den generischen Namen ID zu verwenden, weil es verwirrend werden kann, wenn Sie anfangen, Tabellen miteinander zu verbinden, kann sogar IDTable1 die Dinge viel einfacher machen

1

In SQL Server, eine korrelierte Unterabfrage mit:

update t1 
set t1.Counts = (
    select count(*) 
    from t2 
    where t2.[Values] = t1.[Values] 
    ); 

rextester Demo: http://rextester.com/SBYNB72372

In MySQL, eine korrelierte Unterabfrage mit:

update t1 
set t1.Counts = (
    select count(*) 
    from t2 
    where t2.`Values` = t1.`Values` 
    ); 

rextester Demo: http://rextester.com/DDDC21719


Obwohl diese Art der Sache könnte besser in einer view anstatt in der t1 Tabelle gespeichert berechnet werden.

In 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; 

In 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

Ich würde die Weisheit Frage des wie in einer Tabelle Spur einer Zählung zu halten. Dies führt zu einer schlechten relationalen Datenbankstruktur und -verwaltung. Stattdessen empfehle ich Ihnen die count Spalte aus der Tabelle entfernen 1. Wann immer Sie dann die Zählungen sehen müssen, benutzen Sie einen Blick:

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

Dies Ihrer Daten in einem dynamisch aktualisierte Ansicht führt anstelle einer statischen Auffassung, dass hat das Potenzial, abgestanden zu werden, ohne dass du es merkst.

+0

Es hängt alles von der Situation ab. In diesem Beispiel würde ich Ihnen zustimmen. Wenn dies oft aufgerufen wird und Tausende von Zeilen vorhanden sind, kann dies zu einem Leistungsproblem werden, insbesondere wenn keine Indizes vorhanden sind. –

Verwandte Themen