0

Wenn ich das folgende Skript ausführen, wird Original_Table durch die UPDATE Anweisung aktualisiertUPDATE mit WITH-Klausel AS

WITH temp AS (
    SELECT 
     ROW_NUMBER() over (partition by x order by y) row_num, x, z 
    FROM Original_Table) 

UPDATE temp set z = a + (select ISNULL(SUM(a),0) from temp A where A.x= temp.xand A.row_num < temp.row_num) 

Aber wenn ich ersetzen MIT mit den folgenden

CREATE TABLE 
    #temp 
(
    row_num INT NOT NULL , 
    x INT NOT NULL, 
    a DECIMAL NOT NULL , 
    z DECIMAL NULL 
); 

insert into #temp 
    SELECT 
     ROW_NUMBER() over (partition by x order by y) row_num, x, z 
    FROM Original_Table 

UPDATE temp set z = a + (select ISNULL(SUM(a),0) from temp A where A.x= temp.xand A.row_num < temp.row_num) 

die UPDATE Updates nur die #temp Tabelle aber nicht Original_Table

Warum ist das?

+0

Dies wird als allgemeiner Tabellenausdruck bezeichnet. Für MS Sql siehe https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx – Serg

+2

Ich sehe keinen Versuch, 'original_table' zu ​​aktualisieren. –

+0

das 'UPDATE' ist das gleiche. Nur 'WITH' ändert sich. –

Antwort

2

Das erste Beispiel aktualisiert temp, die auf einer Abfrage von Original_Table über die CTE basiert. Die Basistabelle wird aktualisiert, wenn der CTE aktualisiert wird. Wie erklärt here, ist der CTE innerhalb der Umfang der UPDATE Aussage.

Das zweite Beispiel fragt Original_Table und speichert das Ergebnis in einer neuen Tabelle : #temp. Die temporäre Tabelle wird dann aktualisiert. Es gibt keinen magischen Speicher, der die Zeilen in #temp zurück zu den Reihen in Original_Table bindet, und Sie würden wahrscheinlich nicht einen wollen.

1

Die letzte Aussage

UPDATE temp 
set z = a + (select ISNULL(SUM(a),0) 
       from temp A where A.x= temp.x 
       and A.row_num < temp.row_num) 

aktualisiert nur einige Tabellennamen "temp". Es gibt nichts in der Aussage Original_Table

+0

im ersten Fall aktualisiert es 'Original_Table' –

+0

Ja tut es, weil Original_Table innerhalb der Anweisung referenziert wird. Ihr erstes Skript ist eine einzelne Anweisung - ein langer und einigermaßen komplexer allgemeiner Tabellenausdruck, der eine Aktualisierung durchführt. Das zweite Skript besteht aus drei Anweisungen: eine CREATE (temp) TABLE, gefolgt von einem INSERT, gefolgt von einem UPDATE. –