15

3 つのテーブルがあり、それぞれに外部キーがあります。結合を実行すると、列が重複します。

与えられた

mysql> describe Family;
+---------------+-------------+------+-----+---------+-------+
| Field         | Type        | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| HEAD_name     | varchar(45) | NO   | PRI |         |       |
| Family_Size   | int(11)     | NO   |     |         |       |
| Gender        | char(1)     | NO   |     |         |       |
| ID_Number     | int(11)     | NO   |     |         |       |
| DOB           | date        | NO   |     |         |       |
| Supervisor_ID | int(11)     | NO   | MUL |         |       |
+---------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

mysql> describe SUPERVISOR;
+-------------------+---------------+------+-----+---------+-------+
| Field             | Type          | Null | Key | Default | Extra |
+-------------------+---------------+------+-----+---------+-------+
| Supervisor_ID     | int(11)       | NO   | PRI |         |       |
| Supervisor_Name   | varchar(45)   | NO   |     |         |       |
| Supervisor_Number | decimal(10,0) | NO   |     |         |       |
| Center_ID         | int(11)       | NO   | MUL |         |       |
+-------------------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> describe CENTER;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| Center_ID | int(11)     | NO   | PRI |         |       |
| Location  | varchar(45) | NO   |     |         |       |
+-----------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

私のクエリステートメント:

SELECT * from Family
   JOIN SUPERVISOR on ( Family.Supervisor_ID = SUPERVISOR.Supervisor_ID)
   JOIN CENTER on (SUPERVISOR.Center_ID = CENTER.Center_ID); 

私の目的は、重複する列なしで結合からすべての列の 1 つの行を取得することです。では、使用すべき SQL ステートメントの構文は何ですか?

4

4 に答える 4

21

を使用すると、MySQL はデフォルトですべてのテーブルのすべての列を返します*。必要な方法で列を取得するには、クエリに列名を明示的に入力する必要があります。次のようにクエリを使用します。

SELECT A.HEAD_name, A.Family_Size, A.Gender, A.ID_Number, A.DOB,
    B.Supervisor_ID, B.Supervisor_Name, B.Supervisor_Number,
    C.Center_ID, C.Location
FROM Family A
JOIN SUPERVISOR B on ( A.Supervisor_ID = B.Supervisor_ID)
JOIN CENTER C on (B.Center_ID = C.Center_ID);
于 2012-12-17T04:32:19.340 に答える
15

この問題は「USING」キーワードで解決できます。

SELECT * from Family
   JOIN SUPERVISOR on ( Family.Supervisor_ID = SUPERVISOR.Supervisor_ID)
   JOIN CENTER on (SUPERVISOR.Center_ID = CENTER.Center_ID); 

あなたの場合、クエリは次のようになります

SELECT * FROM FAMILY 
  JOIN (SUPERVISOR JOIN CENTER USING(Center_ID)) USING(Supervisor_ID);

ポイントはシンプルです.2つのテーブルA(a、b)とB(b、c)がある場合、結合後、(a、b、c)の形式で結果を生成します

Select *
    from A JOIN B USING(b);

3つの列(a、b、c)を持つResult-Setを提供します

注:Usingで複数のパラメータを使用できるかどうかわからないため、サブクエリとして作成しました。

于 2015-05-11T18:02:44.797 に答える
1

重複する列は取得されていません。実際に取得されているのは、テーブルFamilyのSupervisor_ID列(つまりFamily.Supervisor_ID)とテーブルSupervisorのSupervisor_ID(つまりSupervisor.Supervisor_ID)ですが、結果セットには両方がSupervisor_IDとして表示されます。 、そしてそれがあなたがそれらが複製されていると思う理由です。Center_iDでも同じことが起こります。

解決策は、各テーブルから必要なフィールドを指定し、Supervisor_IDとCenter_IDを取得する必要があるかどうか、およびどのテーブルから取得するかを決定することです。

于 2012-12-17T04:36:09.653 に答える
0

oreillyによると、

説明計画を探します。
_select x from y internaljoin....ここでw=z...これは単なる例です

于 2012-12-17T04:38:44.000 に答える