为什么此表达式会导致sql错误?

gmxoilav  于 2021-07-26  发布在  Java
关注(0)|答案(4)|浏览(293)

我正在学习sql。一个任务是写表达式

SELECT MIN(Price), ProductName 
FROM Products;

编辑https://www.w3schools.com/sql/trysql.asp?filename=trysql_op_in 并拍摄结果图像。
我的老师说这对他很好。当我这样做时,sql返回
您试图执行的查询不包括作为聚合函数一部分的指定表达式“productname”
我找到的答案包括改变程序的设置(我做不到)或者做一些我还没有学会的事情。为什么这个表达对我和我的老师有不同的回报,我能做些什么来改变这个?

pu82cl6c

pu82cl6c1#

因为您不能为product name列对许多不同的值进行分组,而必须指定要对其进行分组的确切方式。
你想买一个吗 SUM(ProductName) 或者 LIST(ProductName 或者 AVG(ProductName) 或者别的什么?
你想怎么处理 ProductName ,您打算如何使用该列?
您可以(使用函数式编程中的术语)将多个值折叠成一个值

SELECT MIN(Price), MAX(ProductName) FROM Products

或者您应该将其指定为锚定,将一个组与其他组分开。

SELECT MIN(Price), ProductName 
FROM Products
GROUP BY ProductName

在进行聚合时,查询的每一列都必须
每个组值都是唯一的,告诉相邻组中的一个组(然后应该在GROUPBY子句中列出)
或者由您选择的聚合函数通过每个值组进行聚合(然后您应该指定要使用的函数)
另一个问题是使用 ProductName 作为一个关键领域。
这通常是个坏主意,原因很多(至少三个)。通常,您需要一个整数数字id和一个单独的表,其中包含产品的每个合成id的名称和其他属性。
另请参见:
代理密钥与自然/业务密钥
https://www.databasejournal.com/features/mssql/article.php/3922066
http://www.dbasupport.com/forums/showthread.php?47953-natural-vs-synthetic-keys

qnakjoqk

qnakjoqk2#

避免将普通列与派生列的聚合函数混合使用。对于测试,您可以使用:

SELECT MIN(Price) AS PRICE 
FROM Products;
fbcarpbf

fbcarpbf3#

您的查询将在mysql(旧版本)或sqlite中工作。但您不需要聚合查询。在这种情况下, ORDER BY 以及 LIMIT 你想要什么:

SELECT p.Price, p.ProductName 
FROM Products p
ORDER BY p.Price
LIMIT 1;

你的老师应该知道这一点,不应该教坏语法。它不是sql标准,在大多数数据库中都不起作用。
你的语法被破坏了,因为 GROUP BY 以及 SELECT 子句不兼容--在 SELECT (我认为其他答案可以解释这一点)。

gg58donl

gg58donl4#

很明显你和你的老师有不同的设置或者不同版本的数据库程序。如果是我的sql。mysql只提供了一个设置\u full \u group \u,您可以在https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html 如何满足你的需要。如果您无法更改设置,则可能无法解决此问题。

相关问题