0

理解できない結果を示す入れ子になった SQL クエリがあります。このクエリは、PARTNER_USER テーブルを介して PARTNER テーブルと USER テーブルを結合します。パートナーは基本的にユーザーの集まりであり、このクエリの目的は、ID 34 を持つパートナーに登録された 20 番目のユーザーがいつ登録されたかを把握することです。

select p.partner_id id,
       u.created_on launch_date
from   user u join partner_user pu
using (user_id) join partner p
using (partner_id)
where  p.partner_id = 34
and    u.user_id     =
       (select  nu.user_id
       from     user nu
       join     partner_user npu using (user_id)
       join     partner np using (partner_id)
       where    np.partner_id = 34
       order by nu.created_on limit 19, 1)

ただし、最後の2行目を次のように変更すると

       where    np.partner_id = p.partner_id

クエリは、「サブクエリが複数の行を返します」というエラー メッセージで失敗します。最初のクエリは機能するのに、2 番目のクエリは機能しないのはなぜですか? 彼らは私と同等に見えます。

ありがとう、ドン

4

4 に答える 4

3

JPunyonは正しいです。いずれかのクエリを最初に実行してから、事後に結果をトリミングする必要があります。

記述されたとおりにクエリを見る場合、外部クエリは、where句を適用するために内部クエリの結果を知る必要があります。ただし、指定すると

where    np.partner_id = p.partner_id

内部クエリでは、内部クエリに外部クエリの結果を知らせて、where句も適用しようとしています。これは循環依存です。

人間として、クエリを読むことができます。この特定のケースでは、外部クエリのwhere句で特定の値を要求し、内部クエリで同じ値を使用するように要求していることがわかります。したがって、データベースはそれを認識し、外部クエリからの同じリテラル値を使用する必要があるように見えます。

実際には、内部クエリは、の可能な値を知らなくても最初に実行されるp.partner_idため、「複数行」エラーが発生します。

于 2009-01-20T20:49:30.843 に答える
1

= 演算子を使用してサブクエリの結果と比較すると、サブクエリは 1 行しか返さない場合があります。サブクエリによって返されるすべての行を確認する場合は、IN 演算子を使用する必要があります。

AND u.User_Id IN ( SELECT .... )
于 2009-01-20T20:31:14.780 に答える
0

サブクエリの where 句を変更すると、水門が開かれます。メイン クエリの where 句は、サブクエリを制限しません。したがって、複数の結果が得られます。

編集: これはどのデータベースですか? 以前に「使用」構造に出くわしたことはありません...

于 2009-01-20T20:37:29.167 に答える
0

@Jason Punyon mysql は USING コンストラクトをサポートしています。

于 2010-07-31T16:49:17.163 に答える