忍者ブログ
  • 2024.03
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 2024.05
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/04/20 21:48 】 |
[SQLite]え、SQLiteって副問い合わせで=使えないの?
表題通り。
結構SQLServerに載ってるT-SQLはちょっと変なので、他のSQLに乗り換えたとき疑問が発生することがある。今回はサブクエリ(副問い合わせ)のイコールについて調べてみた。

 SELECT
     ファイル名
 FROM D_ファイル
 WHERE ファイルID = 
     (
         SELECT
             ファイルID
         FROM D_ファイル単語
         WHERE 単語 = 'テスト'
     );

ってSELECT文を用意したんだが、なぜか副問い合わせしたファイルIDを取得する
SELECT文が一行しか取得できん。
なぜだ。

■調べてみた
----------------------------------------------------------------------------------------------------
Subquery Expressions

A SELECT statement enclosed in parentheses is a subquery. All types of SELECT statement, including aggregate and compound SELECT queries (queries with keywords like UNION or EXCEPT) are allowed as scalar subqueries. The value of a subquery expression is the first row of the result from the enclosed SELECT statement. In other words, an implied "LIMIT 1" is added to the subquery, overriding an explicitly coded LIMIT. The value of a subquery expression is NULL if the enclosed SELECT statement returns no rows.

A subquery that returns a single column is a scalar subquery and can be used most anywhere. A subquery that returns two or more columns is a row value subquery and can only be used as the operand of a comparison operator.
----------------------------------------------------------------------------------------------------
翻訳翻訳英語を翻訳ぅ~~!
----------------------------------------------------------------------------------------------------
サブクエリ式

括弧で囲まれたSELECT文はサブクエリです。 集合型および複合SELECTクエリ(UNIONまたはEXCEPTなどのキーワードを含むクエリ)を含む、すべてのタイプのSELECT文は、スカラ副問合せとして使用できます。 副問合せ式の値は、囲まれたSELECT文の結果の最初の行です。 つまり、暗黙の「LIMIT 1」がサブクエリに追加され、明示的にコーディングされたLIMITがオーバーライドされます。 囲まれたSELECT文が行を戻さない場合、副問合せ式の値はNULLです。

単一の列を返すサブクエリはスカラーサブクエリで、ほとんどの場所で使用できます。 2つ以上の列を返すサブクエリは行値の副問い合わせであり、比較演算子のオペランドとしてのみ使用できます。
----------------------------------------------------------------------------------------------------
はーん。要するにT-SQLとは仕様が違って、サブクエリを=参照すると一行だけ取得される仕様になっているわけだ。なるほどね-。
もう少し掘り進めてみると、=の代わりにINを使えばいいことがわかった。
(以下の章に詳しい。また相関サブクエリ等で検索すると理解が深まる。
・The IN and NOT IN operators
・Correlated Subqueries)
ちなみに似たような使い方でIN、NOT INまたはEXISTSを使うことが出来る。

……よくよく考えてみるとなんでT-SQLで=が使えたんだろうな。
こっちの方が文法的に合理的だし、わかりやすいよな。
しみじみとT-SQLはくs…謎だと感じるな。

■まとめ
・SQLiteでサブクエリを参照するときは1行のときに=、複数行の場合はINを使うこと。
・INの他に、NOT INやEXISTSを使用できる。

PR
【2017/05/17 11:52 】 | SQLite | コメント(0)
<<[C#]directory.existsの結果が常にFalseになる | ホーム | SQLiteの照合順序について簡単なレポート>>
コメント
コメント投稿














<<前ページ | ホーム | 次ページ>>