【问题标题】:What is wrong with this nested SELECT statement compared to the one that works?与有效的相比,这个嵌套的 SELECT 语句有什么问题?
【发布时间】:2020-10-21 18:30:02
【问题描述】:

我正在使用 Microsoft 分发的 AP 数据库。这有效:

USE AP
SELECT V.VendorName, InvoiceDate, InvoiceTotal
FROM Invoices I 
INNER JOIN Vendors V ON I.VendorID = V.VendorID
WHERE InvoiceTotal > 
    (SELECT AVG(InvoiceTotal)
     FROM Invoices)
ORDER BY InvoiceTotal

这不起作用:

SELECT AP.dbo.Invoices.InvoiceTotal, AP.dbo.Vendors.VendorName, AP.dbo.Invoices.InvoiceDate
FROM     AP.dbo.Invoices INNER JOIN
                  AP.dbo.Vendors ON AP.dbo.Invoices.VendorID = AP.dbo.Vendors.VendorID
WHERE  AP.dbo.Invoices.InvoiceTotal >
                      (SELECT AVG(AP.dbo.Invoices.InvoiceTotal) AS Expr1
                       FROM      AP.dbo.Invoices AS Invoices_1)

我在上面的查询中得到的错误是:

消息 147,级别 15,状态 1,行 5 聚合可能不会出现在 WHERE 子句中,除非它位于 HAVING 子句或选择列表中包含的子查询中,并且被聚合的列是外部引用。

【问题讨论】:

  • 拥有两个 AP.dbo.Invoices 的表别名...由于您已重命名子查询 AP.dbo.Invoices,因此 AVG() 中的列属于另一个 AP.dbo.Invoices 表实例.

标签: sql sql-server ssms


【解决方案1】:

使用表别名!

SELECT i.InvoiceTotal, v.VendorName, i.InvoiceDate
FROM AP.dbo.Invoices i INNER JOIN
     AP.dbo.Vendors v
     ON i.VendorID = v.VendorID
WHERE i.InvoiceTotal > (SELECT AVG(i2.InvoiceTotal)
                        FROM AP.dbo.Invoices i2
                       );

您的代码不起作用,因为子查询未引用子查询中的表。那将是invoice_1.InvoiceTotal 而不是你所拥有的。聚合函数不允许引用外部查询。

【讨论】:

  • @nicomp 这回答了你的问题吗?
猜你喜欢
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多