2015-12-17 12 views
8

値なしの列のための選択肢を追加するためにいくつかのクエリを編集中に、私が誤って(ここでsimplyfiedバージョンである)このようなものを書いた:SQLの構文:選択(副選択)でサブクエリとして句からなしを選択

SELECT id, (SELECT name) FROM t 

私の驚いたことに、MySQLはエラーをスローしませんでしたが、私の期待した結果(nameのカラム値)を与えるクエリを完了しました。 私はそれについてのドキュメントを見つけようとしましたが、成功しませんでした。

このSQL標準ですか、MySQLの専門ですか?
この構文の結果が、本当に同じ(外側の)テーブルの列の値であることを確認できますか?

SELECT id, (SELECT name FROM t AS t1 where t1.id=t2.id) FROM t AS t2 

しかしEXPLAINレポート、私はとても素敵だと思い旧バージョン、についてExtra欄のNo tables used:拡張版はこのようになります。ここで

は(それは私のためにタイムアウト続け、私はあなたがより良い運を持っていることを望みます)シンプルfiddle on SqlFiddleです。

明確化:私はサブクエリについて知っていますが、私はいつも選択するテーブルを暗示したサブクエリを作成しました。したがって、実行プランに追加のステップが生じます。私の質問は、この構文とそれが与える結果、MySQLでは期待値を返さないようです。

+0

私がチェックし、それはおそらくMySQLの専門ではないだけですので、それはまた、SQLiteのとMSSQLで動作します。 –

+0

興味深いことに、サブクエリは列を選択しても書き込むことができます。私はまた、このような2つ以上の列を選択できるかどうかを知りたいと思っていますか? –

+0

@ Kanike Vamshi Krishna彼が持っているのはサブクエリなので、彼は1列だけ返すようにしています。水っぽい;相関サブクエリを参照すると、そこにあなたの経験に関する良い情報がいくつか見つかります。 – KorreyD

答えて

2

これはSQL言語のデフォルト動作であり、SQL ANSI 2011 over ISO/IEC 9075-1:2011(en)のドキュメントで定義されています。残念ながら、それは開いていません。この動作は、4.11節「SQL文」で説明しています。

select id, (select name) from some 

それは、外側のクエリの列とnameフィールドを処理することを見つけようとします:データベースは、それが発生したのであれば、句からなしを選択COMANDを処理するため

この動作が発生します。

幸いなことに、私はansweredここに誰かがいて、オンラインのSQL ANSIドキュメントへの有効なリンクを見つけましたが、それはSQL ANSI 99のためであり、セクションは同じものではないかもしれません新しい文書として。私は、それがセクション4.30の周りにあることをチェックしなかったと思う。見てみましょう。そして、私は実際に読むことをお勧めします(私はその日に戻ってきました)。

Database Language SQL - ISO/IEC 9075-2:1999 (E)

3

あなたの最初のクエリ内で何は、単にテーブルトンから列を返す相関サブクエリです。実際のサブクエリはここで実行する必要はありません(これはあなたのEXPLAINがあなたに伝えているものです)。 SQLデータベースクエリで

、(また 同期サブクエリとしても知られる)相関サブクエリは、外部クエリからの値を使用してサブクエリ(別の クエリ内にネストされたクエリ)です。

https://en.wikipedia.org/wiki/Correlated_subquery

SELECT id, (SELECT name) FROM t 

また
SELECT id, (SELECT t.name) FROM t 

あなたの第二のクエリ

SELECT id, (SELECT name FROM t AS t1 where t1.id=t2.id) FROM t AS t2 

contaiと同じですnsの相関サブクエリですが、実際にはt1.id = t2.idのレコードを見つけるためにテーブルtのクエリを実行しています。

+0

私はサブクエリについて知っています。リンクしたページ内のすべての例は、常にFROM句を暗示しています。あなたが引用した部分が私が経験している振る舞いについてのヒントを与えることを認識しています。私は明確にするために私の質問を編集しました。 – watery

0

これは標準ではありません。オラクルでは、

select 1, (select 2) 
from dual 

はどのようにあなたの結果を確認することができますORA-00923: FROM keyword not found where expected

、エラーがスローされますか?あなたがそれを書く前に、どのようなクエリが習得しているのかをよりよく理解してください。問題のexetendedバージョンでさえ、意味をなさない。

+0

「Oracleはそれを拒否する」とは、何かが標準ではないという魅力的な証拠ではありません。私はあなたの最後の文に同意します。私は、それが*本当の*クエリーではないと願っています。 – ruakh

+0

By *私が得た結果を確認できますか?*(今削除されました)実際には、構文が実際に同じテーブルの列の値を読み取っていることを確認できるドキュメントが見つかりませんでした。拡張版は、私が通常同じ結果を得るために書いたものです。私は編集した、私はそれがより明確であることを望む。 – watery