3 Stimmen

SQL Server UPDATE mit WHERE, das sich über 2 Tabellen erstreckt

Ich habe eine SQL Server-Datenbank und muss eine Aktualisierungsabfrage manuell durchführen. Es können keine Lösungen mit einer Programmiersprache verwendet werden (gespeicherte Verfahren können verwendet werden).

In der Abfrage sind 4 Tabellen betroffen (/verwendet).

  • [Bestellungen]
  • [StatusHistoryForOrder]
  • [StatusHistory]
  • [Zustände]

Ich muss das Feld [Orders].[OrderStatusID] aktualisieren, das ein Fremdschlüssel zu [Statuses] ist. (Der Status der Bestellung wird also tatsächlich geändert. Die Tabelle [StatusHistoryForOrder] ist eine Verknüpfungstabelle zu [StatusHistory] und enthält nur 2 Spalten.

  • [StatusHistoryForOrder].[OrderId]
  • [StatusHistoryForOrder].[OrderStatusHistoryid]

Sagen Sie nicht, dass das nicht logisch ist, denn das weiß ich schon. Das Unternehmen, das die Datenbank entworfen hat, ist ein völlig zurückgebliebenes Unternehmen, aber die Datenbank ist jetzt zu groß, um die Dinge in Ordnung zu bringen, und es gibt weder die Zeit noch das Geld, um es zu tun.

Die Tabelle [StatusHistory] hat mehrere Spalten:

  • [StatusHistory].[OrderStatusHistoryId]
  • [StatusHistory].[OrderStatusId]
  • [StatusHistory].[Datum]
  • [StatusHistory].[Nachricht]

Die [StatusHistory].[OrderStatusId] ist auch ein Fremdschlüssel zu [Statuses].

In der Aktualisierungsabfrage muss ich den Status des Auftrags auf Status 16 aktualisieren. Aber nur für Zeilen, die jetzt den Status 1 haben und älter als 60 Tage sind. Ich weiß, ich kann das Datum mit der Funktion

DATEDIFF(DD,[StatusHistory].[Date],GETDATE()) > 60

Aber wie kann diese Abfrage implementiert werden, wenn das Datumsfeld nicht in den Aufträgen enthalten ist? Und um die neue [StatusHistory] zu setzen, muss eine neue Zeile für diese Tabelle erstellt werden und die Tabelle [StatusHistoryForOrder] braucht auch eine neue Zeile und die ID dieser Zeile muss in der Tabellenzeile [Orders] gesetzt werden.

Weiß jemand, wie man das macht? Ich bin ziemlich neu in SQL Server (oder SQL für diese Angelegenheit) und ich habe absolut keine Ahnung, wo zu beginnen.

Schlussfolgerung:

Ich benötige eine gespeicherte Prozedur, die zunächst jede Zeile in [Orders] überprüft, wenn die [StatusHistory].[Date] (die mit der Bestellung über Fremdschlüssel verknüpft ist) dieser Bestellung älter als 60 ist. Wenn sie älter ist, muss eine neue StatusHistory-Zeile mit dem aktuellen Datum und Status 16 eingefügt werden. Dann muss in [StatusHistoryForOrder] eine neue Zeile mit der neuen ID der StatusHistory eingefügt werden, die in [StatusHistoryForOrder].[OrderStatusHistoryid] und der in [StatusHistoryForOrder].[OrderId] eingestellten Auftragsnummer festgelegt wurde. Und zu guter Letzt: Die [Orders].[OrderStatusID] muss ebenfalls auf 16 gesetzt werden.


Eine Select-Abfrage, um das Datum und den Status der Bestellung auszuwählen:

SELECT     TOP (100) PERCENT 
    dbo.Orders.OrderID, 
    dbo.Statuses.Description AS Status, 
    dbo.StatusHistory.Date
FROM         
    dbo.Orders 
INNER JOIN
    dbo.Statuses 
ON 
    dbo.Orders.OrderStatusID = dbo.Statuses.StatusId 
INNER JOIN
    dbo.StatusHistoryForOrder 
ON 
    dbo.Orders.OrderID = dbo.StatusHistoryForOrder.OrderId 
INNER JOIN
    dbo.StatusHistory 
ON 
    dbo.StatusHistoryForOrder.OrderStatusHistoryid = dbo.StatusHistory.OrderStatusHistoryId
WHERE     
    (dbo.Statuses.StatusId = 1) 
AND 
    (DATEDIFF(DD, dbo.StatusHistory.Date, GETDATE()) > 60)

UPDATE Für @marc_s:

Column info


Kann mir jemand dabei helfen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X