回答編集履歴

3

説明追記

2022/09/27 13:20

投稿

hatena19
hatena19

スコア33757

test CHANGED
@@ -11,4 +11,30 @@
11
11
 
12
12
  二つ目のSQLは、サブクエリ内に、nameフィールドはあります。この場合、近いnameフィールドを参照しますので、サブクエリ内のpeopleテーブルのnameフィールドを参照します。つまり、サブクエリに対する条件ということになります。親クエリには影響を与えません。よって、希望の結果が得らることになります。
13
13
 
14
+ ---
14
15
 
16
+ 2つ目のSQLは、メインとサブのpeopleテーブルに別名をつけて記述すると下記になります。
17
+ ```sql
18
+ SELECT movies.id, title FROM movies
19
+ JOIN stars ON movies.id = stars.movie_id
20
+ JOIN people a ON stars.person_id = a.id
21
+ WHERE a.name = "Johnny Depp"
22
+ AND movies.id IN
23
+ (SELECT movies.id FROM movies
24
+ JOIN stars ON movies.id = stars.movie_id
25
+ JOIN people b ON stars.person_id = b.id
26
+ WHERE b.name = "Helena Bonham Carter");
27
+ ```
28
+ これは希望の結果が得られます。
29
+ このサブクエリの条件を下記のように親クエリのフィールドを参照するように書き換えると、結果は0件になります。
30
+ ```sql
31
+ SELECT movies.id, title FROM movies
32
+ JOIN stars ON movies.id = stars.movie_id
33
+ JOIN people a ON stars.person_id = a.id
34
+ WHERE a.name = "Johnny Depp"
35
+ AND movies.id IN
36
+ (SELECT movies.id FROM movies
37
+ JOIN stars ON movies.id = stars.movie_id
38
+ JOIN people b ON stars.person_id = b.id
39
+ WHERE a.name = "Helena Bonham Carter");
40
+ ```

2

説明追記

2022/09/27 13:07

投稿

hatena19
hatena19

スコア33757

test CHANGED
@@ -9,6 +9,6 @@
9
9
  つまり、親クエリに ` people.name = "Johnny Depp" and people.name = "Helena Bonham Carter"`という条件を設定したのと同意になります。
10
10
  このような条件に合致するレコードはないので、当然1件を抽出されないことになります。
11
11
 
12
+ 二つ目のSQLは、サブクエリ内に、nameフィールドはあります。この場合、近いnameフィールドを参照しますので、サブクエリ内のpeopleテーブルのnameフィールドを参照します。つまり、サブクエリに対する条件ということになります。親クエリには影響を与えません。よって、希望の結果が得らることになります。
12
13
 
13
14
 
14
-

1

説明修正

2022/09/27 12:50

投稿

hatena19
hatena19

スコア33757

test CHANGED
@@ -1,6 +1,14 @@
1
- 最初のSQLのサブクエリ内の下記のSQLは、name は people.name ということになりますが、movies のフィールド以外を対象にしたら抽出条件として意味をなさないので、結果は0件になります。
1
+ 最初のSQLのサブクエリ内の下記のSQLは、name は people.name ということになります ~~が、movies のフィールド以外を対象にしたら抽出条件として意味をなさないので、結果は0件になります。~~
2
2
 
3
3
  ```sql
4
4
  SELECT movies.id FROM movies
5
- WHERE name = "Helena"
5
+ WHERE name = "Helena Bonham Carter"
6
6
  ```
7
+
8
+ よって、`people.name = "Helena Bonham Carter"` という条件式になりますので、親クエリのフィールドに対する条件になります。
9
+ つまり、親クエリに ` people.name = "Johnny Depp" and people.name = "Helena Bonham Carter"`という条件を設定したのと同意になります。
10
+ このような条件に合致するレコードはないので、当然1件を抽出されないことになります。
11
+
12
+
13
+
14
+