2016-07-01 24 views
-1

Der Code in etwa so:Nach CTE Auswahl der Reihenfolge Dadurch und dann aktualisieren, werden aktualisieren Ergebnisse die gleiche (TSQL) nicht bestellt

WITH cte AS 
(
SELECT TOP 4 id, due_date, check 
FROM table_a a 
INNER JOIN table_b b ON a.linkid = b.linkid 
WHERE 
    b.status = 1 
    AND due_date > GetDate() 
ORDER BY due_date, id 
) 
UPDATE cte 
SET check = 1 
OUTPUT 
INSERTED.id, 
INSERTED.due_date 

Hinweis: die tatsächlichen Daten gleichen DUE_DATE hat.

Wenn ich die SELECT-Anweisung nur innerhalb der CTE ausgeführt habe, könnte ich das Ergebnis erhalten, zB: 1, 2, 3, 4. Aber nach der UPDATE-Anweisung sind die aktualisierten Ergebnisse: 4, 1, 2, 3

Warum passiert das (Auftragsänderung)?

Wie behalten oder ordnen Sie die Ergebnisse zurück zu 1,2,3,4 in der gleichen 1 Abfrage?

+0

I Kampf um herauszufinden, was Sie wirklich mit diesem zu erreichen versuchen, aber ich bezweifle, dass die Reihenfolge der Daten ist anders, aber es ist mehr bis zu Ihrem wählen vs Die output-Klausel, weil Ihre Ausgabe nicht geordnet ist. –

+1

Entlang [Microsoft] (https://msdn.microsoft.com/en-us/library/ms177564.aspx) wird die Bestellung nicht mit OUTPUT-Klausel garantiert, so dass Sie dieses OUTPUT durch ein neues SELECT TOP 4 ersetzen müssen id, due_date ... ' – Polux2

+0

@ AllanS.Hansen Entschuldigung, wenn meine Frage nicht klar war. Ich habe versucht, die gleiche Reihenfolge während der Cte Select und nach dem Update zu erreichen. Ich nehme an, dass sich die Bestellung nach dem Update nicht ändert. – kurakura88

Antwort

0

In MSDN https://msdn.microsoft.com/pl-pl/library/ms177564(v=sql.110).aspx können Sie das lesen

Es gibt keine Garantie, dass die Änderungen in der die Reihenfolge an den Tisch und die Reihenfolge, in der die Zeilen eingefügt werden in die Ausgabetabelle oder eine Tabelle angelegt werden Variable wird entsprechen.

Das bedeutet, dass Sie Ihr Problem mit nur einer Abfrage nicht lösen können. Aber Sie können immer noch eine Charge verwenden, um das zu tun, was Sie brauchen. Da Ihre Ausgabe die Bestellung nicht garantiert, müssen Sie sie in einer anderen Tabelle speichern und nach dem Update bestellen. Dieser Code wird Ihre Ausgangswerte zurück, um, dass Sie davon ausgehen:

declare @outputTable table(id int, due_date date); 

with cte as (
    select top 4 id, due_date, check 
    from table_a a 
    inner join table_b b on a.linkid = b.linkid 
    where b.status = 1 
    and due_date > GetDate() 
    order by due_date, id 
) 
update cte 
set check = 1 
output inserted.id, inserted.due_date 
into @outputTable; 

select * 
from @outputTable 
order by due_date, id; 
+0

Danke! Ich war mir nicht bewusst, dass es nach dem Update keine Garantie in der Bestellung gibt. Ich denke, dass dies (eine Charge) meine einzige Wahl ist, um die Reihenfolge intakt zu halten. – kurakura88