1

次のデータベース スキーマをご覧ください。

create table Person (id int not null identity,
                     [index] varchar(30),
                     datecreated datetime, 
                     groupid int)

create table [Group] (id int identity not null, description varchar(30))

サンプルデータ:

insert into Person ([index],datecreated,groupid) values ('4,5,6','2011-01-01',1)
insert into Person ([index],datecreated,groupid) values ('1,2,3','2011-02-02',1)
insert into Person ([index],datecreated,groupid) values ('7,8','2012-02-02',2) 

insert into [Group] (description) values ('TestGroup')
insert into [Group] (description) values ('TestGroup2')

以下のSQL文を見てください。

select  *    
from Person 
inner join [Group] on Person.groupid = [group].id 
where [group].description = 'TestGroup' 
order by 
   left(substring([index], charindex(',', [index]) + 1, 200),  
        charindex(',', substring([index], charindex(',', [index]) + 1, 200)) - 1)

この SQL ステートメントは、次のエラーで失敗します。

SUBSTRING 関数に無効な長さパラメーターが渡されました。

このエラーの原因はorder by句です。つまり、インデックス列の 3 番目の要素を見つけようとしていますが、3 番目の要素が行 3 に存在しません (要素が 2 つしかありません)。

ただし、[group].description = 'TestGroup'レコード 3 は除外されると思います。これは事実ではないようです。order by節が節の前に実行されているかのようですwhere。クエリから句を除外するとorder by、クエリが実行されます。

どうしてこれなの?

4

3 に答える 3

0

このORDERBYはかなり残酷です。一時テーブルまたはテーブルの部分式を使用して、これをいくつかのクエリに分割することをお勧めします。これにより、最初にフィルタリングを実行したり、並べ替えるデータを含む列を作成したりできます。

于 2012-05-23T17:25:48.847 に答える
0

SQLは宣言型言語であり、手続き型言語ではないことを忘れないでください。つまり、必要な結果セットを記述します。実行プランの設定は、SQLコンパイラー/オプティマイザーに依存します。

非常に一般的に、SQLエンジンには、テーブルからデータを読み取り、そのデータに必要なすべての計算を実行するコンポーネントがあります。もちろん、これにはSELECT句での計算だけでなく、「ON」句、「WHERE」句、および「ORDERBY」句での計算も含まれます。

エンジンは、データを読み取った、フィルタリングを実行できます。これにより、エンジンは計算された値をフィルタリングに簡単に使用できます。

すべてのデータベースがこのように機能すると言っているわけではありません。私が言っているのは、SQLステートメントの操作の順序は保証されていないということです。この状況は、間違った順序で実行するとエラーが発生し、SQLが完了しない場合の1つです。エラーが発生しないようにクエリを書き直す手助けが必要ですか?

于 2012-05-23T17:45:11.217 に答える
0

SQL での評価順序の保証は非常に弱いものです。おそらくソートが最初に実行され、次にストリーム集約が実行されます。それ自体は何も悪いことではありません。

一般に、実行順序に依存することはできません。入力が無効になるNULL場合に、order by のようにダミー値を作成するために使用できる case-expression を除きます。評価順序を強制する唯一の方法はケースです。SUBSTRING

于 2012-05-23T17:11:47.550 に答える