Ich habe eine einfache Tabellenstruktur wie diese:
Tabelle tempData
╔══════════╦═══════╗
║ NAME ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║ 80 ║
║ Ravi ║ 85 ║
║ Sanjay ║ 90 ║
╚══════════╩═══════╝
Und ich habe auch andere Tabellennamen wie tempDataView wie diese
╔══════════╦═══════╗
║ NAME ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║ ║
║ Narendra ║ ║
║ Narendra ║ ║
║ Narendra ║ ║
║ Ravi ║ ║
║ Ravi ║ ║
║ Sanjay ║ ║
╚══════════╩═══════╝
Ich möchte die Tabelle aktualisieren tempDataView , indem Sie die Einstellung Marks auf die nach tempDataView - Namen verglichen mit TempData - Namen
Ja, lassen Sie mich Ihnen zeigen, was ich versucht habe. Ich habe versucht, dies mit dem Cursor zu lösen, und es ist perfekt gelöst, aber ich finde den Weg, es mit der Unterabfrage zu lösen
Hier ist es:
Declare @name varchar(50),@marks varchar(50)
Declare @cursorInsert CURSOR
set @cursorInsert = CURSOR FOR
Select name,marks from tempData
OPEN @cursorInsert
FETCH NEXT FROM @cursorInsert
into @name,@marks
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE tempDataView set marks = @marks where name = @name
FETCH NEXT FROM @cursorInsert
INTO @name,@marks
END
CLOSE @cursorInsert
DEALLOCATE @cursorInsert
Eigentlich ist es für mich wie eine Hausaufgabe, sie mit der Unterabfrage zu lösen.
sql
sql-server
tsql
sql-update
Narendra Pal
quelle
quelle
subquery
, aber ich benutze lieberJOIN
alsSUBQUERY
.INDEX
auf denmarks
Spalten definieren? Sollte es nicht auf denName
Spalten sein?SELECT
zuSELECT TOP 1
Da Sie gerade erst lernen, empfehle ich Ihnen, das Konvertieren von SELECT-Joins in UPDATE- oder DELETE-Joins zu üben. Zuerst schlage ich vor, dass Sie eine SELECT-Anweisung generieren, die diese beiden Tabellen verbindet:
SELECT * FROM tempDataView a INNER JOIN tempData b ON a.Name = b.Name
Beachten Sie dann, dass wir zwei Tabellen-Aliase
a
und habenb
. Mit diesen Aliasen können Sie einfach eine UPDATE-Anweisung generieren, um entweder Tabelle a oder b zu aktualisieren. Für Tabelle a haben Sie eine Antwort von JW. Wenn Sie aktualisieren möchten, lautetb
die Anweisung:UPDATE b SET b.marks = a.marks FROM tempDataView a INNER JOIN tempData b ON a.Name = b.Name
Um die Anweisung in eine DELETE-Anweisung zu konvertieren, verwenden Sie denselben Ansatz. Die folgende Anweisung wird
a
nur aus (wobei b intakt bleibt) für die Datensätze gelöscht , die nach Namen übereinstimmen:DELETE a FROM tempDataView a INNER JOIN tempData b ON a.Name = b.Name
Sie können die von JW erstellte SQL-Geige als Spielplatz verwenden
quelle
Hier in meinem Beispiel finde ich die Lösung dafür, weil ich das gleiche Problem mit Updates und Subquerys hatte:
UPDATE A SET A.ValueToChange = B.NewValue FROM ( Select * From C ) B Where A.Id = B.Id
quelle
Der Titel dieses Threads fragt, wie eine Unterabfrage in einem Update verwendet werden kann. Hier ist ein Beispiel dafür:
update [dbName].[dbo].[MyTable] set MyColumn = 1 where ( select count(*) from [dbName].[dbo].[MyTable] mt2 where mt2.ID > [dbName].[dbo].[MyTable].ID and mt2.Category = [dbName].[dbo].[MyTable].Category ) > 0
quelle
Hier ist eine schöne Erklärung des Update-Vorgangs mit einigen Beispielen. Es handelt sich zwar um eine Postgres-Site, die SQL-Abfragen gelten jedoch auch für die anderen DBs. Die folgenden Beispiele sind intuitiv zu verstehen.
-- Update contact names in an accounts table to match the currently assigned salesmen: UPDATE accounts SET (contact_first_name, contact_last_name) = (SELECT first_name, last_name FROM salesmen WHERE salesmen.id = accounts.sales_id); -- A similar result could be accomplished with a join: UPDATE accounts SET contact_first_name = first_name, contact_last_name = last_name FROM salesmen WHERE salesmen.id = accounts.sales_id;
Die zweite Abfrage kann jedoch zu unerwarteten Ergebnissen führen, wenn salesmen.id kein eindeutiger Schlüssel ist, während die erste Abfrage garantiert einen Fehler auslöst, wenn mehrere ID-Übereinstimmungen vorliegen. Wenn für einen bestimmten Eintrag in accounts.sales_id keine Übereinstimmung besteht, setzt die erste Abfrage die entsprechenden Namensfelder auf NULL, während die zweite Abfrage diese Zeile überhaupt nicht aktualisiert.
Daher ist für das gegebene Beispiel die zuverlässigste Abfrage wie folgt.
UPDATE tempDataView SET (marks) = (SELECT marks FROM tempData WHERE tempDataView.Name = tempData.Name);
quelle