0

SQL自己結合を理解しようとしています。従業員の名、姓、住所、市区町村を含む次のテーブル「persons」があります(ソースW3Schools)。

mysql> select * from persons;
+------+-----------+-----------+--------------+-----------+
| P_id | LastName  | FirstName | Address      | City      |
+------+-----------+-----------+--------------+-----------+
|    1 | Hansen    | Ola       | Timoteivn 10 | Sandnes   | 
|    2 | Svendson  | Tove      | Borgvn 23    | Sandnes   |
|    3 | Pettersen | Kari      | Storgt 20    | Stavanger |
+------+-----------+-----------+--------------+-----------+

「ハンセンオラ」と同じ都市の従業員の名前を返したいと思います。だから私は自己結合を書き、それはうまくいきます:

mysql> select p1.Lastname, p1.firstname from persons p1, persons p2 where p1.city =    p2.city and p2.lastname = 'Hansen';
+----------+-----------+
| Lastname | firstname |
+----------+-----------+
| Hansen   | Ola       |
| Svendson | Tove      |
+----------+-----------+

ただし、エイリアスp2をp1に変更すると、つまりp2.lastname ='Hansen'からp1.lastname='Hansen'に変更すると、両方の従業員の名前が取得されません。

mysql> select p1.Lastname, p1.firstname from persons p1, persons p2 where p1.city = p2.city and p1.lastname = 'Hansen';
+----------+-----------+
| Lastname | firstname |
+----------+-----------+
| Hansen   | Ola       |
| Hansen   | Ola       |
+----------+-----------+

エイリアスをp2からp1に変更すると結果が変わる理由を誰かが理解するのを手伝ってもらえますか?ありがとうございました。

4

3 に答える 3

1

クエリは少し奇妙で、実際にどのような根拠があるのか​​わかりません。基本的に、city列が一致するテーブルをそれ自体と結合し、テーブルlastnameの1つを指定して、結果を制限します。限られた行だけを選択する代わりに行うと、テーブルがそれ自体とクロス結合されており、要件SELECT *によってフィルタリングされた行の外積が返されていることがわかります。実際の結果は次のとおりです。citylastname

p1.firstname, p1.lastname, p2.firstname, p2.lastname
Hansen        Ola          Hansen        Ola
Hansen        Ola          Svendson      Toda

条件が逆になるため、元のクエリではこれが逆になります。

于 2013-03-04T04:09:58.917 に答える
1

あなたの質問を強調させてください、そしてうまくいけばそれはもっと理にかなっているでしょう:

select p1.lastname, ...
from persons p1, persons p2
where ... and p1.lastname = 'Hansen'

したがって、結果を最初のテーブルp1からのレコードのみを返すように制限しています。同時に、最初のテーブルをlastname='Hansen'のテーブルのみに制限しています。制限のない結果セットを想像すると、より理にかなっている場合があります(WHERE完全な製品を表示するために、句のあいまいな部分を削除しました)。

select p1.Lastname as p1_lastname, p2.lastname as p2_lastname
from persons p1, persons p2
where p1.city = p2.city

P1_LASTNAME     P2_LASTNAME
Hansen  Hansen
Svendson    Hansen
Hansen  Svendson
Svendson    Svendson
Pettersen   Pettersen

上記の結果セットを取得して条件を追加すると、p1.lastname = "Hansen"「ハンセン」だけが表示されるのは当然です。

于 2013-03-04T04:17:55.170 に答える
0

クエリは、「Hansen」を含む行のみを返します。自己参加をフォローしていません。

于 2013-03-04T04:07:21.590 に答える