SQL查询不能在FROM语句中使用变量

时间:2018-12-07 21:27:10

标签: sql

我是SQL的新手,很抱歉遇到一些愚蠢的问题。

表将来自以下SQL沙箱: https://www.w3schools.com/sql/trysql.asp?filename=trysql_asc

有格式表

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable, axes_size

arr = np.random.randint(0, 100, (2, 3, 4))

fig, ax = plt.subplots(1, 1)   
pax = ax.imshow(arr, vmin=0, vmax=100)
cbar_txt='arb. units'
cbar_kws=dict(ticks=(0, 100))


divider = make_axes_locatable(ax)
cax = divider.append_axes('right', size='5%', pad=0.05)
cbar = ax.figure.colorbar(pax, cax=cax, **dict(cbar_kws))
cbar.set_label(cbar_txt, size = 20)
cbar.ax.tick_params(labelsize = 10)
plt.tight_layout()
plt.show()

我想获得最大平均数量的产品。

我可以使用以下查询来获取它:

OrderDetailID   OrderID ProductID   Quantity
1               10248   11          12
2               10248   42          10
3               10248   72          5
4               10249   14          9
5               10249   51          40

我在这里两次使用块

SELECT avg.ProductID, avg.Quantity
FROM (
  SELECT ProductID, AVG(Quantity) Quantity
  FROM OrderDetails
  GROUP BY ProductID
) avg
WHERE avg.Quantity = (
    SELECT MAX(Quantity) FROM (
      SELECT ProductID, AVG(Quantity) Quantity
      FROM OrderDetails
      GROUP BY ProductID
    )
)

ProductID   Quantity
8           70
48          70

因为如果我对 SELECT ProductID, AVG(Quantity) Quantity FROM OrderDetails GROUP BY ProductID 而不是第二个块使用查询

avg

我收到错误SELECT avg.ProductID, avg.Quantity FROM ( SELECT ProductID, AVG(Quantity) Quantity FROM OrderDetails GROUP BY ProductID ) avg WHERE avg.Quantity = (SELECT MAX(Quantity) FROM avg)

所以我的问题是:

  1. 这是一种语法错误吗,可以简单地纠正,或者由于某些原因我不能使用这样的变量?
  2. 是否有更简单的方法来进行我需要的查询?

2 个答案:

答案 0 :(得分:4)

使用WITH子句考虑公用表表达式(CTE),可避免重复和重新计算聚合子查询。大多数RDBMS支持CTE(在SQL TryIt链接页面中完全有效)。

WITH avg AS (
  SELECT ProductID, AVG(Quantity) Quantity
  FROM OrderDetails
  GROUP BY ProductID
)

SELECT avg.ProductID, avg.Quantity
FROM avg
WHERE avg.Quantity = (
    SELECT MAX(Quantity) FROM avg
)

答案 1 :(得分:0)

  1. 这实际上不是语法问题,而是范围:您尝试 引用不在父子关系中的别名。只有这样,他们才能互相引用。 (标识符是一个别名,而不是变量-这是另一回事。)

  2. 一种更简单的方法是在运行过滤条件之前创建一个临时集-如上一个答案那样,使用CTE,也可以尝试使用临时表。它们可以在任何地方使用,因为它们的范围不在子查询中。