it-swarm.com.de

Aktualisieren Sie die Abfrage mithilfe der Unterabfrage in SQL Server

Ich habe eine einfache Tabellenstruktur wie folgt:

Tabelle tempData

╔══════════╦═══════╗
║   NAME   ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║    80 ║
║ Ravi     ║    85 ║
║ Sanjay   ║    90 ║
╚══════════╩═══════╝

Und ich habe auch andere Tabellennamen wie tempDataView so

╔══════════╦═══════╗
║   NAME   ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║       ║
║ Narendra ║       ║
║ Narendra ║       ║
║ Narendra ║       ║
║ Ravi     ║       ║
║ Ravi     ║       ║
║ Sanjay   ║       ║
╚══════════╩═══════╝

Ich möchte die Tabelle tempDataView aktualisieren, indem Sie die Marks entsprechend dem tempDataView - Name setzen, die mit tempData - Name verglichen werden.

Ja, ich zeige Ihnen, was ich ausprobiert habe. Ich habe versucht, dies mit dem Cursor zu lösen, und es ist perfekt gelöst, aber ich finde einen Weg, um es mit der Subquery 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 wie eine Hausaufgabe für mich, sie mit der Unterabfrage zu lösen. 

51
Narendra Pal

sie können beide Tabellen auch mit UPDATE-Anweisungen verknüpfen,

UPDATE  a
SET     a.marks = b.marks
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name

definieren Sie für eine schnellere Leistung eine INDEX für die Spalte marks in beiden Tabellen.

mit SUBQUERY

UPDATE  tempDataView 
SET     marks = 
        (
          SELECT marks 
          FROM tempData b 
          WHERE tempDataView.Name = b.Name
        )
118
John Woo

da Sie gerade erst lernen, empfehlen wir Ihnen, ein SELECT-Join in ein UPDATE- oder ein DELETE-Join zu konvertieren. 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 Tabellenaliasnamen a und b haben. Mit diesen Aliasnamen können Sie auf einfache Weise eine UPDATE-Anweisung generieren, um die Tabelle a oder b zu aktualisieren. Für Tabelle a haben Sie eine Antwort von JW. Wenn Sie b aktualisieren möchten, lautet 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 dieselbe Methode. Die folgende Anweisung wird nur aus a (und lässt b intakt) für die Datensätze gelöscht, die mit dem Namen übereinstimmen:

DELETE a
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name

Sie können die von JW erstellte SQL Fiddle als Spielplatz verwenden

25
cha

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
1
Graham Laight

Hier ist eine nette Erklärung des Update-Vorgangs mit einigen Beispielen. Es handelt sich zwar um eine Postgres-Site, die SQL-Abfragen sind jedoch auch für die anderen DBs gültig .. Die folgenden Beispiele sind intuitiv verständlich.

-- 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 account.sales_id-Eintrag keine Übereinstimmung vorhanden ist, werden die entsprechenden Namensfelder in der ersten Abfrage auf NULL gesetzt, während die zweite Abfrage diese Zeile überhaupt nicht aktualisiert.

Daher ist die zuverlässigste Abfrage für das gegebene Beispiel wie folgt. 

UPDATE tempDataView SET (marks) =
    (SELECT marks FROM tempData
     WHERE tempDataView.Name = tempData.Name);
0
Memin