1

私は3つのテーブルを持っています:

+--------+-----------+  
| fName  | lName     |  
+--------+-----------+  
| Paul   | McCartney |  
| John   | Lennon    |  
| Jon    | Stewart   |  
| Daniel | Tosh      |  
| Steven | Colbert   |  
| Pink   | Floyd     |  
| The    | Beatles   |  
| Arcade | Fire      |  
| First  | Last      |  
| Andrew | Bird      |  
+--------+-----------+  

出版物

+----+---------------------------------------+------+-----------+---------+  
| id | title                                 | year | pageStart | pageEnd |  
+----+---------------------------------------+------+-----------+---------+  
|  9 | The Dark Side of the Moon             | 1973 |         0 |       0 |  
| 10 | Piper At The Gates of Dawn            | 1967 |         0 |       0 |  
| 11 | Sgt. Pepper's Lonely Hearts Band Club | 1967 |         0 |       0 |  
| 12 | Happy Thoughts                        | 2007 |         0 |      60 |  
| 13 | Wish You Were Here                    | 1975 |         0 |       0 |  
| 14 | Funeral                               | 2004 |         0 |       0 |  
+----+---------------------------------------+------+-----------+---------+  

Person_Publication

+-----------+----------------+--------+---------------+  
| person_id | publication_id | editor | author_number |  
+-----------+----------------+--------+---------------+  
|        11 |             11 |      0 |             1 |  
|        12 |             11 |      0 |             1 |  
|        16 |              9 |      0 |             1 |  
|        17 |             11 |      0 |             1 |  
+-----------+----------------+--------+---------------+  

次のクエリを使用して、特定の出版物のすべての著者を選択しようとしています。

SELECT fName , lName 
FROM Publication , Person, Person_Publication 
WHERE Person.id = Person_Publication.person_id 
AND Person_Publication.publication_id = 11;

しかし、私が得る結果は常に重複しています(何らかの理由で常に6倍です)。結果:

+-------+-----------+
| fName | lName     |
+-------+-----------+
| Paul  | McCartney |
| John  | Lennon    |
| The   | Beatles   |
| Paul  | McCartney |
| John  | Lennon    |
| The   | Beatles   |
| Paul  | McCartney |
| John  | Lennon    |
| The   | Beatles   |
| Paul  | McCartney |
| John  | Lennon    |
| The   | Beatles   |
| Paul  | McCartney |
| John  | Lennon    |
| The   | Beatles   |
| Paul  | McCartney |
| John  | Lennon    |
| The   | Beatles   |
+-------+-----------+
18 rows in set (0.03 sec)

なぜこれが起こっているのか、これを修正する方法を教えてください。

4

2 に答える 2

2

6 倍の結果が得られます。パブリケーション行ごとに正確に 1 つです。

FROM 句からパブリケーションを削除します。

SELECT fName , lName 
FROM Person, Person_Publication 
WHERE Person.id = Person_Publication.person_id 
AND Person_Publication.publication_id = 11;
于 2013-06-23T00:53:35.940 に答える
1

クエリに 3 つのテーブルを含めています。

FROM Publication, Person, Person_Publication 

ただし、結合条件は 1 つだけです。

WHERE Person.id = Person_Publication.person_id 

と の間のデカルト積にPublicationなります。Person JOIN Person_Publication

WHERE次の条件をブロックに追加します。

AND Publication.id = Person_Publication.publication.id

明示的な JOIN 構文が好まれる理由の完璧な例です。次の構文を使用します。

SELECT fName, lName 
FROM Publication
JOIN Person_Publication ON Person_Publication.publication.id = Publication.id
JOIN Person ON Person.id = Person_Publication.person_id
WHERE Person_Publication.publication_id = 11;

.. そのような間違いは絶対に起こり得ません。

于 2013-06-23T00:54:50.073 に答える