我有这个mySQL select语句,就像我需要它一样工作;
SELECT `requires`, `level` FROM `fp` WHERE `model` = '".$model."' GROUP BY `level` ORDER BY `menu_order`
在表格中,需要,级别是char字段。当按* menu_order *排序时, level 的每个值的第一行将始终是我想要检索的 requires 的值。
对于我使用的SQL版本;
SELECT requires, level FROM fp WHERE model = '" & model & "' GROUP BY level ORDER BY menu_order
现在,当我尝试在SQL上运行相同的查询时,我得到了;
requires'_is_invalid_in_the_select_list_because_it_is_not_contained_in_either_an_aggregate_function_or_the_GROUP_BY_clause
我发现了很多这个错误的例子,但似乎都比我想做的更复杂。也许我一直在使用mySQL,以至于我的大脑陷入了这种思维方式。
如何用SQL编写select语句?
答案 0 :(得分:0)
如果您要使用支持窗口函数的RDBMS(MS SQL Server,Postgres,Oracle),则可以使用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值的第一行将始终是我想要检索的require值。
答案 1 :(得分:0)
很难将你的sql转换为MsSQL(如果你的意思是SQL),正如MySQL和MsSQL允许使用GROUP BY的方式略有不同。
聚合的功能类似于SUM(),AVG(),COUNT()。因为requires不是聚合,它必须在GROUP BY列表中,否则会出现该错误
您需要告诉我们您要做的事情:我想尝试找到层次结构?
MSSQL
SELECT level, requires
FROM fp
WHERE model = '" + model + "'
GROUP BY level, requires
OR
SELECT level, count(*)
FROM fp
WHERE model = '" + model + "'
GROUP BY level