2017-07-04 7 views
1

Ich bin neu in SQL, also sei sanft! Ich arbeite für eine Wohltätigkeitsorganisation in London, also habe ich einen Stich bei SQL und ich bin bei etwas stecken geblieben, das Sie wahrscheinlich alle mit geschlossenen Augen tun können.SQL-Update-Zeile mit Informationen aus einer anderen Zeile (Anfänger)

Ich habe eine Tabelle mit Zeilen, die ich aktualisieren möchten:

The table

Es ist eine Tabelle potenzielle doppelte Datensätze in unserer Datenbank zeigt nach oben. Es gibt eine gespeicherte Prozedur, die aus Daten eines Kundenkontos ein Kriterienfeld erstellt, und wenn Kriterienfelder aus 2 Datensätzen übereinstimmen, werden sie als potenzielle Duplikate gekennzeichnet.

Wir haben einige bekannte Duplikate, die wir vor einer Weile erstellen mussten, die Placeholder als den Nachnamen haben.

Das Kriterium-Feld stimmt mit anderen 'echten' Datensätzen mit echten Nachnamen überein, die wir behalten möchten.

Was ich tun möchte, ist:

  1. Aktualisierung der Status der Placeholder diejenigen Delete; und die ‚echten‘ diejenigen Keep (auch ich kann total blitz, dass!)
  2. Updates des Keep-ID-Feld der Placeholder denjenigen, so ist es das CUSTOMER_NO Feld der Zeile mit dem Anpassungskriterium Feld

Sobald das ist fertig, eine andere gespeicherte Prozedur wird es von dort übernehmen.

Hilfe!

+2

Howdy ... Paar von Dingen, können Sie Ihre dbms (SQL Server, Oracle, MySQL, etc) taggen? Kannst du auch posten, was du bisher versucht hast? Schließlich wären diese Daten für uns einfacher zu handhaben, wenn Sie sie in Ihrem Q als Tabelle anstatt als Bild veröffentlichen. – JohnHC

+2

Willkommen bei Stack Overflow. Bitte nehmen Sie sich einige Momente Zeit, um eine [Tour] (https://stackoverflow.com/tour) zu machen und auch [how-to-ask] (https://stackoverflow.com/questions/how-to-ask) zu lesen bessere Antworten auf Ihre Fragen –

Antwort

0

Hallo Willkommen zu Stack Overflow.

Wenn ich verstanden haben Sie richtig benötigen Sie so etwas wie dieses:

declare @customers table(
    customer_no int NOT NULL, 
    matching_criteria varchar(50) NOT NULL, 
    lname varchar(50) NOT NULL, 
    keepID int NULL, 
    [status] varchar(50) NULL); 

INSERT INTO @customers VALUES(1, 'a', 'Smith', null, null); 
INSERT INTO @customers VALUES(2, 'a', 'Placeholder', null, null); 
INSERT INTO @customers VALUES(3, 'b', 'Jones', null, null); 
INSERT INTO @customers VALUES(4, 'b', 'Placeholder', null, null); 
INSERT INTO @customers VALUES(5, 'c', 'Brown', null, null); 
INSERT INTO @customers VALUES(6, 'c', 'Placeholder', null, null); 
INSERT INTO @customers VALUES(7, 'd', 'Williams', null, null); 
INSERT INTO @customers VALUES(8, 'd', 'Placeholder', null, null); 
INSERT INTO @customers VALUES(9, 'e', 'Taylor', null, null); 
INSERT INTO @customers VALUES(10, 'e', 'Placeholder', null, null); 

SELECT * FROM @customers; 

UPDATE @customers set [status] = case lname WHEN 'Placeholder' THEN 'DELETE' ELSE 'Keep' END; 

SELECT * FROM @customers; 

UPDATE k 
SET keepID = d.customer_no 
FROM 
@customers k 
INNER JOIN @customers d 
on k.matching_criteria = d.matching_criteria 
WHERE d.[status] = 'Delete' AND k.[status] = 'Keep'; 

SELECT * FROM @customers; 

Wenn Sie SQL Server verwenden Sie können dies in einer Abfrage-Fenster einfügen und die Ergebnisse beobachten.

Bitte geben Sie für zukünftige Referenz an, welche DB Sie verwenden, da die Antworten von db zu db variieren. Das obige ist speziell SQL Server. Während sich die meisten dbs ähnlich verhalten werden, tun einige dies nicht. Die obigen Aktualisierungen für einen Join. Oracle zum Beispiel lässt dies nicht zu, deshalb ist die Syntax bei der Verwendung von Oracle anders - Oracle kann natürlich das Gleiche erreichen, es verwendet nur andere SQL, um dies zu tun.

+0

Danke! Ich habe das leicht geändert und es hat total funktioniert. Auf das DB-Ding hingewiesen - daran habe ich nicht einmal gedacht. Dies war auf SQL Server 2014 (und es ist T-SQL, glaube ich). –

+0

Ich bin froh, dass ich geholfen habe. –

Verwandte Themen