0

必要に応じて機能するこの mySQL select ステートメントがあります。

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

この表で、requireとlevelの両方が 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 を使ってきたので、私の脳はその考え方に固執しているのかもしれません。

そのselectステートメントはSQLでどのように記述すべきですか?

4

2 に答える 2

0

MySQL と MsSQL で GROUP BY の使用を許可する方法にわずかな違いがあるため、SQL を MsSQL に正確に変換するのは困難です (SQL の意味がそれである場合)。

集計は、SUM()、AVG()、COUNT() などの関数です。requires は集計ではないため、GROUP BY のリストに含まれている必要があります。そうしないと、そのエラーが発生します。

あなたが何をしようとしているのかを私たちに知らせる必要があります。

MSSQL

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 に答える