Máy chủ SQL truy vấn tương quan 2014


7

Tôi (không thành công) sử dụng truy vấn con tương quan trên bảng Hóa đơn:

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

để tìm tổng số hóa đơn chưa thanh toán lớn nhất của tất cả các nhà cung cấp, trong đó điều kiện chưa thanh toán được đưa ra bởi InvoiceTotal-PaymentTotal-CreditTotal <0:

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

Truy vấn bên trong chạy, tốt và xấu, vì truy vấn được cho là tương quan, nhưng toàn bộ truy vấn không chạy và tôi nhận được thông báo lỗi:

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

Tôi đang làm gì sai?


6
Chỉ cần FYI, bạn không sử dụng một truy vấn con tương quan ở đó. Đó được gọi là bảng dẫn xuất. Một truy vấn con được gọi là tương quan nếu nó tham chiếu bất kỳ bí danh bảng nào được tìm thấy trong mệnh đề TỪ [truy vấn bên ngoài] và nằm trong bất kỳ phần nào của truy vấn [bên ngoài]: mệnh đề SELECT, toán tử ỨNG DỤNG, mệnh đề WHERE, mệnh đề WHERE, TRÊN điều khoản tham gia.
Andriy M

@AndriyM: Bạn nói đúng, thưa ngài, cảm ơn bạn. Ngoài ra, truy vấn trong ngoặc đơn tự chạy)
MSIS

Câu trả lời:


7

Thêm một bí danh cho bảng dẫn xuất trước ;ví dụ VendLargestUnpaidInv :

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

1
Chỉ tò mò: tại sao một bí danh làm cho một sự khác biệt như vậy?
MSIS

3

Hoặc để làm cho nó dễ đọc hơn, sử dụng CTE (Biểu thức bảng chung)

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

Điểm tốt, sẽ thử điều này.
MSIS
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.