、私はテーブルが含まれているSQLiteのデータベースを持っているとしましょう。なぜSELECT 0、...の代わりに、SELECT
sqlite> select t0.id, t0.firstname, t0.lastname from person t0;
これはうまく動作し、これを使用します。しかし私は、SQLを生成するApple(Core Data)のフレームワークで作業してきました。このフレームワークは若干異なるSQLクエリを生成します。
sqlite> select 0, t0.id, t0.firstname, t0.lastname from person t0;
このフレームワークによって生成されたすべてのSQLクエリは「0を選択」で始まります。何故ですか?
私はexplainコマンドを使って何が起こっているのかを調べようとしましたが、これは決して決してわかりませんでした。
sqlite> explain select t0.id, t0.firstname, t0.lastname from person t0;
addr opcode p1 p2 p3 p4 p5 comment
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
0 Trace 0 0 0 00 NULL
1 Goto 0 11 0 00 NULL
2 OpenRead 0 2 0 3 00 NULL
3 Rewind 0 9 0 00 NULL
4 Column 0 0 1 00 NULL
5 Column 0 1 2 00 NULL
6 Column 0 2 3 00 NULL
7 ResultRow 1 3 0 00 NULL
8 Next 0 4 0 01 NULL
9 Close 0 0 0 00 NULL
10 Halt 0 0 0 00 NULL
11 Transactio 0 0 0 00 NULL
12 VerifyCook 0 1 0 00 NULL
13 TableLock 0 2 0 person 00 NULL
14 Goto 0 2 0 00 NULL
そして、2番目のクエリのためのテーブルには、次のようになります。
sqlite> explain select 0, t0.id, t0.firstname, t0.lastname from person t0;
addr opcode p1 p2 p3 p4 p5 comment
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
0 Trace 0 0 0 00 NULL
1 Goto 0 12 0 00 NULL
2 OpenRead 0 2 0 3 00 NULL
3 Rewind 0 10 0 00 NULL
4 Integer 0 1 0 00 NULL
5 Column 0 0 2 00 NULL
6 Column 0 1 3 00 NULL
7 Column 0 2 4 00 NULL
8 ResultRow 1 4 0 00 NULL
9 Next 0 4 0 01 NULL
10 Close 0 0 0 00 NULL
11 Halt 0 0 0 00 NULL
12 Transactio 0 0 0 00 NULL
13 VerifyCook 0 1 0 00 NULL
14 TableLock 0 2 0 person 00 NULL
15 Goto 0 2 0 00 NULL
しかし、テーブルBから一定の '0'は、*ではありません。すべての結果レコードに無条件に戻されます。 –
@ CL。私が意味することをより明確にするために編集されました。 – hvd
しかし、Core Dataは最も外側のクエリに '0'を置きます。 –