2016-07-12 17 views
2

Ich habe eine gespeicherte Prozedur, die 4 temporäre Tabellen erstellt und dann Datensätze mit einer großen Auswahl mit inneren Verknüpfungen am Ende zurückgibt. Dies ist eine beschnittene Version der Auswahl, die Datensätze zurückgibt.SQL-Update basierend auf Anzahl

SELECT R.*, 
    REC.Status_Date as [Receive Status Date], 
    RET.Status_Date as [Return Status Date] 
FROM #Records R 
    INNER JOIN #Temp_Receive REC ON R.ID1 = REC.ID1 
    INNER JOIN #Temp_Return RET ON R.ID1 = RET.ID1 
    INNER JOIN #Temp_Submittal SUB ON SUB.RecID = REC.ID AND SUB.RetID = RET.ID 

Beachten Sie, dass es mehrere #TEMP_Receive und #TEMP_Return Datensätze für die gleiche ID1 und der #TEMP_Submittal Tisch sein kann, ist das, was sie verbindet.

Ich muss diese Prozedur ändern, um die Anzahl der Feiertage zwischen den zwei Statusdaten in zwei verschiedenen Tabellen aufzunehmen, die in den Ergebnissen enthalten sind. Ich kann die Anzahl der Feiertage von einer separaten Tabelle aus zählen. Etwas wie dieses:

Select count(*) 
From Holiday_List 
Where Holiday_Date between REC.Status_Date and RET.Status_Date 

Ich fügte der #Temp_Receive Tabelle eine Spalte Holiday_Count hinzu. Wie kann ich die Spalte Holiday_Count im Join mit der Zählung aus der Tabelle Holiday_List aktualisieren? Ich habe so etwas ausprobiert, aber von dem, was ich finden kann, ist dies nicht fern gültige SQL-Syntax.

UPDATE 
( #Records R 
    INNER JOIN #TEMP_Receive REC ON R.ID1 = REC.ID1 
    INNER JOIN #TEMP_Return RET ON R.ID1 = RET.ID1 
    INNER JOIN #TEMP_Submittal SUB ON SUB.RecID = REC.ID AND SUB.RetID = RET.ID) 
SET REC.Holiday_Count = 
(SELECT COUNT(*) 
    FROM HOLIDAY_LIST HOL 
    WHERE HOL.HOLIDAY_DATE between #TEMP_Receive.Status_Date AND #TEMP_Receive.Status_Date) 

Ich bin mit MS SQL Server 2012.

Antwort

0

1) Versuchen select Aussage zu bauen, um zu sehen, welche Zeilen aktualisiert werden. In Ihrem Fall sieht die Abfrage möglicherweise so aus.

SELECT R.*, 
    REC.Status_Date as [Receive Status Date], 
    RET.Status_Date as [Return Status Date], 
    (Select count(*) 
     From Holiday_List 
     Where Holiday_Date between REC.Status_Date and RET.Status_Date) cnt 
FROM #Records R 
    INNER JOIN #Temp_Receive REC ON R.ID1 = REC.ID1 
    INNER JOIN #Temp_Return RET ON R.ID1 = RET.ID1 
    INNER JOIN #Temp_Submittal SUB ON SUB.RecID = REC.ID AND SUB.RetID = RET.ID 

2) Wenn alles OK sieht dann select Teil mit update Anweisung ersetzen.

update #Temp_Receive 
    set Holiday_Count = (Select count(*) 
     From Holiday_List 
     Where Holiday_Date between REC.Status_Date and RET.Status_Date) 
FROM #Records R 
    INNER JOIN #Temp_Receive REC ON R.ID1 = REC.ID1 
    INNER JOIN #Temp_Return RET ON R.ID1 = RET.ID1 
    INNER JOIN #Temp_Submittal SUB ON SUB.RecID = REC.ID AND SUB.RetID = RET.ID 

beachten Sie auch, dass mehrere inner join implizit legen nahe, dass gleiche ID1 s in allen vier Tabellen vorhanden sind.

+0

Das funktionierte wie ein Zauber. Netter Schritt weise Antwort. Danke für die Hilfe! –

Verwandte Themen