Korrelierte Unterabfrage SQL Server 2014


7

Ich verwende (erfolglos) eine korrelierte Unterabfrage für eine Rechnungstabelle:

Invoices(InvoiceID,  VendorID, InvoiceTotal, PaymentTotal, CreditTotal,.... ),

um die Summe der größten unbezahlten Rechnungen aller Anbieter zu ermitteln, wobei die unbezahlte Bedingung gegeben ist durch InvoiceTotal-PaymentTotal-CreditTotal <0:

 Select Sum(LargestUnpaid) from 
 (Select   Max(InvoiceTotal) AS LargestUnpaid from Invoices 
  where InvoiceTotal-(PaymentTotal+CreditTotal)<0 group by vendorID ) ;

Die innere Abfrage wird ausgeführt, was gut und schlecht ist, da die Abfrage korreliert werden soll, aber die Abfrage als Ganzes nicht ausgeführt wird und ich die Fehlermeldung erhalte:

Msg 102, Level 15, State 1, Line 4 Incorrect syntax near ')'.

Was mache ich falsch?


6
Nur zu Ihrer Information, Sie verwenden dort keine korrelierte Unterabfrage. Das nennt man eine abgeleitete Tabelle. Eine Unterabfrage wird als korreliert bezeichnet, wenn sie auf einen der in der FROM-Klausel der [äußeren Abfrage] gefundenen Tabellenaliasnamen verweist und sich in einem dieser Teile der [äußeren] Abfrage befindet: der SELECT-Klausel, einem APPLY-Operator, der WHERE-Klausel, der ON-Unterabschnitt eines Joins.
Andriy M

@AndriyM: Sie haben Recht, Sir, danke. Zusätzlich läuft die Abfrage in Klammern von selbst)
MSIS

Antworten:


7

Fügen Sie einen Alias ​​für die abgeleitete Tabelle vor dem ;Beispiel VendLargestUnpaidInv hinzu :

Select Sum(LargestUnpaid) from
 (Select   Max(InvoiceTotal) AS LargestUnpaid from Invoices 
  where InvoiceTotal-(PaymentTotal+CreditTotal)<0 group by vendorID ) VendLargestUnpaidInv;

1
Nur neugierig: Warum macht ein Alias ​​so einen Unterschied?
MSIS

3

Oder um die Lesbarkeit zu verbessern, verwenden Sie CTE (Common Table Expression).

With VendLargestUnpaidInv as 
( 
    Select   Max(InvoiceTotal) AS LargestUnpaid from Invoices 
    where InvoiceTotal - (PaymentTotal+CreditTotal)<0 
    group by vendorID
)
select sum(LargestUnpaid) 
from VendLargestUnpaidInv;

Guter Punkt, werde das versuchen.
MSIS
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.