在SQL

时间:2016-02-26 00:53:21

标签: sql-server subquery

我仍然非常擅长SQL,并且最近几天都遇到了这3个特定子查询的问题。

这个应该返回3列,只返回“CA”中的供应商记录并使用派生表。

 -- Query 6
SELECT VendorID, VendorName, Vendors.VendorState
FROM Vendors 
JOIN (SELECT VendorState 
      FROM Vendors) AS SubVendors ON Vendors.VendorID = SubVendors.VendorID
WHERE Vendors.VendorState = 'CA'
ORDER BY VendorID;

但是当我运行它时,我收到了这个错误:

  

Msg 207,Level 16,State 1,Line 6
  列名称“VendorID”无效。

这个返回4列,也使用派生表,子查询在'FROM'子句中编码。

-- Query 7
SELECT 
    InvoicesMain.VendorID, 
    MAX(InvoiceTotal) AS MaxInvoice, 
    MIN(InvoiceTotal) AS MinInvoice, 
    AVG(InvoiceTotal) AS AvgInvoice
FROM 
    Invoices AS InvoiceMain
JOIN
    (SELECT TOP 10 
         VendorID, AVG(InvoiceTotal) AS AvgInvoice
     FROM Invoices
     GROUP BY VendorID
     ORDER BY AvgInvoice DESC) AS TopVendor ON InvoicesMain.VendorID = TopVendor.VendorID)
GROUP 
    InvoicesMain.VendorID
ORDER BY 
    MaxInvoice DESC;

但是我收到了这个错误:

  

Msg 102,Level 15,State 1,Line 9
  ')'附近的语法不正确。

最后,老实说我不知道​​怎么做这个;它应该重新作为子查询重写:

SELECT 
    InvoiceNumber, InvoiceDate, InvoiceLineItemAmount
FROM 
    Invoices 
JOIN 
    InvoiceLineItems ON Invoices.InvoiceID = Invoicelineitems.InvoiceID
WHERE 
    VendorID = 122
ORDER BY 
    InvoiceDate;

请提示?

1 个答案:

答案 0 :(得分:0)

在查询6中,您未在子查询上选择VendorID,这就是错误发生的原因。请尝试此查询:

SELECT VendorID, VendorName, Vendors.VendorState
FROM Vendors JOIN 
(SELECT VendorState, VendorID 
FROM Vendors) AS SubVendors
ON Vendors.VendorID = SubVendors.VendorID
WHERE V.VendorState = 'CA'
ORDER BY VendorID;

对于查询7,您在子查询中缺少)

SELECT InvoicesMain.VendorID, MAX(InvoiceTotal) AS MaxInvoice, MIN(InvoiceTotal) AS MinInvoice, AVG(InvoiceTotal) AS AvgInvoice
FROM Invoices AS InvoiceMain
JOIN
(SELECT TOP 10 VendorID, AVG(InvoiceTotal)) AS AvgInvoice
FROM Invoices
GROUP BY VendorID
ORDER BY AvgInvoice DESC) AS TopVendor
ON InvoicesMain.VendorID = TopVendor.VendorID)
GROUP InvoicesMain.VendorID
ORDER BY MaxInvoice DESC;

对于最后一项,您可以通过从表InvoiceID中选择InvoiceLineItems来恢复此子查询,就像在查询6中一样

SELECT InvoiceNumber, InvoiceDate, InvoiceLineItemAmount
FROM Invoices JOIN 
(SELECT InvoiceID FROM Invoicelineitems) As I
ON Invoices.InvoiceID = I.InvoiceID
WHERE VendorID = 122
ORDER BY InvoiceDate;