暫くぶりに、プログラミングを弄っていて、嵌まりました。
基本中の基本。
でも、忘れていました、 記述の順序!。
専門外のプログラマーが SQL Query を発行する場合、
どうしても、見落し勝ちな事項があります。
特に、
データ取得時。
恐らく、何らかの手段で、Query を試してから、
プログラムに埋め込むでしょう。
でも、単純なサンプルデータ時と違い、
実運用では DataBase は 巨大な ばけもの に変容しているケースも多いですよね。
詳しくは、専門家対象のページをご検索戴くとして、
忘れてはならない ふたつの基本 から、
ステートメント記述順序 を書きます。
ふたつの基本
ORDER で表示順序を明確化
ORDER 句 では 記述の順序も重要
ちょっと、脱線。
どうして、ORDER 句 が 必須なのか?。
単一の値を返す 集計関数等では無視出来ますが、
結果セットが複数行になる場合、ORDER 句 が無いと、
SQL Server (RDBMS) は順序未定で答えを返します。
はい。 編集や削除・追加を繰り返した生データは、内部で、順番がバラバラになっています。
最適化された実行は、環境に応じて、同じ順序に並んだ答えを返す訳では無いのですね。
試しに書いた Query が希望の順序で答えを返しても、 それは偶然かも知れないのです。
故に、SELECT で ORDER BY は 必須 と考えて下さい。.
さて、
実は表示用に書いたフロントエンドでの出来事。
試しに書いたものを叩き台に練り上げていた時の事です。
結果的には、
珍しく、ORDER BY を落として仕舞った Query をアドホック的に投げていました。
表示のみのものなので、
VS Project では .xsd を使わずに、
Query を直接投げ込んでいたのです。
当然、 条件に依っては、希望の一団は分散されて表示されます。
ORDER を加えなければ!。
そこで、何も考えずに、文末に ORDER 句 を追加 ... 。
ここで、落とし穴!。
WHERE 句 は その有無に応じて、文末に更に追加する形のプログラムにしていたので、
基本文の文末に ORDER 句が追加されると ... 。
WHERE 句 付き で、条件を絞った時に、
投げた Query が活きません。
WHERE 句 の無い、全数表示では OK ですが、絞り込みをすると OUT !。.
当然ですね。
SERLECT ... ORDER ... WHERE ... になるので、
不正な文 になって仕舞い、答えは返りませんから。
正解は、
SERLECT ... WHERE ... ORDER ... にしないといけません!。
基本文(末尾 ORDER 句) + WHERE 句 の2変数では無く、
基本文 + WHERE 句 + ORDER 句 の3変数扱いにする必要があった訳です。.
基本的に、ORDER 句 は 最後! と覚えて置くと良いでしょう。( TOP 句 が無い場合 )
以下、公式ドキュメントから抜粋引用します。
SELECT (Transact-SQL)
https://docs.microsoft.com/ja-jp/sql/t-sql/queries/select-transact-sql?view=sql-server-ver15
SQL Serverで、データベースから行を取得し、1 つ以上のテーブルから 1 つ以上の行または列を選択できるようにします。 SELECT ステートメントの完全な構文は複雑ですが、主な句は次のとおりです。
[ WITH { [ XMLNAMESPACES ,] [ <common_table_expression> ] } ]
SELECT select_list [ INTO new_table ]
[ FROM table_source ] [ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]
UNION、EXCEPT、INTERSECT 演算子をクエリ間で使用すると、クエリの結果を結合または比較して単一の結果セットにできます。
<中略>
SELECT ステートメント内の句の順序は重要です。 オプションの句は省略できます。ただし、オプションの句を使用する場合は、適切な順序で指定する必要があります。
<中略>
SELECT ステートメントの論理的な処理順序
以下のステップは、SELECT ステートメントの論理的な処理順序 (バインド順序) を示しています。 この順序によって、1 つのステップで定義されたオブジェクトが、以降のステップにおける句でいつ利用可能になるかが決まります。 たとえば、クエリ プロセッサが FROM 句で定義されているテーブルまたはビューにバインド (アクセス) できる場合、これらのオブジェクトとその列は、以降のすべてのステップで利用できます。 逆に、SELECT 句はステップ 8 にあるので、この句で定義されているすべての列の別名と派生列は、それより前の句では参照できません。 ただし、ORDER BY 句などの後続の句で参照されていることができます。 ステートメントの実際の物理的な実行は、クエリ プロセッサによって決定され、このリストでの順序とは異なる場合があります。
- FROM
- ON
- JOIN
- WHERE
- GROUP BY
- WITH CUBE または WITH ROLLUP
- HAVING
- SELECT
- DISTINCT
- ORDER BY
- TOP
皆さん!、気を付けましょうね。 ;)
0 件のコメント:
コメントを投稿