Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询可以';不要在FROM语句中使用变量_Sql - Fatal编程技术网

SQL查询可以';不要在FROM语句中使用变量

SQL查询可以';不要在FROM语句中使用变量,sql,Sql,我是SQL新手,很抱歉问了个愚蠢的问题 表将从此SQL沙盒中删除: 有一个表格的格式 OrderDetailID OrderID ProductID Quantity 1 10248 11 12 2 10248 42 10 3 10248 72 5 4 10249 14 9 5

我是SQL新手,很抱歉问了个愚蠢的问题

表将从此SQL沙盒中删除:

有一个表格的格式

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
这里我用了两次block

  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没有这样的表:avg)

所以我的问题是:

  • 这是一种语法错误,可以简单地纠正,还是出于某种原因,我不能使用这样的变量
  • 有没有更简单的方法来进行我需要的查询

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

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

  • 一种更简单的方法是在运行筛选条件之前创建一个临时集,就像前面的回答一样,使用CTE,或者您可以尝试使用临时表。它们可以在任何地方使用,因为它们的作用域不在子查询中


  • 任何特定类型的SQL?来源:我们的TrySQL编辑器使用WebSQL来演示SQL。
    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
    )