0

我有这个 mySQL select 语句,它可以按我的需要工作;

SELECT `requires`, `level` FROM `fp` WHERE `model` = '".$model."' GROUP BY `level` ORDER BY `menu_order`

在表中,requireslevel都是 char 字段。当按 *menu_order* 排序时,每个level值的第一行将始终是我想要检索的requires的值。

对于我使用的 SQL 版本;

SELECT requires, level FROM fp WHERE model = '" & model & "' GROUP BY level ORDER BY menu_order

现在,当我尝试在 SQL 上运行相同的查询时,我得到了;

需要'_is_invalid_in_the_select_list_because_it_is_not_contained_in_either_an_aggregate_function_or_the_GROUP_BY_clause

我发现了很多这个错误的例子,但似乎都比我想要做的要复杂得多。也许我已经使用 mySQL 太久了,以至于我的大脑陷入了这种思维方式。

应该如何用 SQL 编写该 select 语句?

4

2 回答 2

0

很难将您的 sql 转换为 MsSQL(如果这就是您所说的 SQL),因为 MySQL 和 MsSQL 允许使用 GROUP BY 的方式略有不同。

聚合是 SUM()、AVG()、COUNT() 等函数。因为 requires 不是一个聚合,它必须在 GROUP BY 的列表中,否则你会得到那个错误

您需要让我们知道您正在尝试做什么:我猜想尝试找到层次结构?

微软SQL

SELECT level, requires 
FROM fp 
WHERE model = '" + model + "' 
GROUP BY level, requires

或者

SELECT level, count(*)
FROM fp 
WHERE model = '" + model + "' 
GROUP BY level
于 2012-11-07T15:51:46.247 回答
0

如果您要使用支持窗口函数(MS SQL Server、Postgres、Oracle)的 RDBMS,您可以ROW_NUMBER使用level. 然后您可以根据您的订单只挑选第一个。

SELECT requires, level
FROM (
    SELECT requires, level, 
        row_number() OVER (PARTITION BY level ORDER BY menu_order) rn
    FROM fp
    WHERE model = '"' + model + '"'
) A
WHERE rn = 1

这是您查询的正确翻译并满足您的要求:

当按 *menu_order* 排序时,每个 level 值的第一行将始终是我想要检索的 requires 的值。

于 2012-11-07T15:45:18.650 回答