我有一张桌子
contacts
---------
contact_id company contact
1000000001 Village Toys John Smith
1000000002 Kids Place Michelle Green
1000000003 Fun4All Jim Jones
1000000004 Fun4All Denise L. Stephens
1000000005 The Toy Store Kim Howard
我想找到Jim Jones工作的公司的所有联系人。这是正确的设置。
1000000003 Fun4All Jim Jones
1000000004 Fun4All Denise L. Stephens
我使用了一个子查询来解决这个问题,但是我得到了正确的结果。我尝试了一个自我内心的联接与'吉姆琼斯'的地方,我得到了我无法理解的结果。
SELECT tableA.contact_id, tableA.company, tableA.contact
FROM company AS tableA
JOIN company AS tableB
ON tableA.company = tableB.company
WHERE tableB.contact = 'Jim Jones'
我得到了正确的结果集
1000000003 Fun4All Jim Jones
1000000004 Fun4All Denise L. Stephens
但是,如果我改变了WHERE
WHERE tableA.contact = 'Jim Jones'
我明白了
1000000003 Fun4All Jim Jones
1000000003 Fun4All Jim Jones
为什么这样做?这究竟是如何工作的?我花了整整一夜试图搞清楚。但它让我望而却步。我在Google上找到的例子无法让我失望。
数据库(在我的问题中,我更改了列名称以进行说明)
http://forta.com/books/0672336073/TeachYourselfSQL_SQLite.zip
http://forta.com/books/0672336073/TeachYourselfSQL_Oracle.zip
http://forta.com/books/0672336073/TeachYourselfSQL_MySQL.zip
http://forta.com/books/0672336073/TeachYourselfSQL_MicrosoftSQLServer.zip
http://forta.com/books/0672336073/TeachYourselfSQL_Access2007.zip
http://forta.com/books/0672336073/TeachYourselfSQL_OpenOfficeBase.zip
您可以使用这种方式获得所需的结果。
SELECT *
FROM TableName
WHERE company IN (SELECT company
FROM TableName
WHERE contact = 'Jim Jones')
在您的查询中,如果您要将WHERE tableB.contact = 'Jim Jones'
更改为WHERE tableA.contact = 'Jim Jones'
,那么您还必须更改SELECT语句。
SELECT tableA.contact_id, tableA.company, tableA.contact
FROM company AS tableA
JOIN company AS tableB
ON tableA.company = tableB.company
WHERE tableB.contact = 'Jim Jones'
SELECT tableB.contact_id, tableB.company, tableB.contact
FROM company AS tableA
JOIN company AS tableB
ON tableA.company = tableB.company
WHERE tableA.contact = 'Jim Jones'
您必须执行此操作,因为您要从此结果中过滤。
(您正在使用company
列进行自联接。)
SELECT *
FROM company AS tableA
JOIN company AS tableB
ON tableA.company = tableB.company
+-----------------+----------------+---------------------+----------------+----------------+---------------------+
| contact_id (A) | company (A) | contact (A) | contact_id (B) | company (B) | contact (B) |
+-----------------+----------------+---------------------+----------------+----------------+---------------------+
| 1000000001 | Village Toys | John Smith | 1000000001 | Village Toys | John Smith |
| 1000000002 | Kids Place | Michelle Green | 1000000002 | Kids Place | Michelle Green |
| 1000000003 | Fun4All | Jim Jones | 1000000003 | Fun4All | Jim Jones |
| 1000000004 | Fun4All | Denise L. Stephens | 1000000003 | Fun4All | Jim Jones |
| 1000000003 | Fun4All | Jim Jones | 1000000004 | Fun4All | Denise L. Stephens |
| 1000000004 | Fun4All | Denise L. Stephens | 1000000004 | Fun4All | Denise L. Stephens |
| 1000000005 | The Toy Store | Kim Howard | 1000000005 | The Toy Store | Kim Howard |
+-----------------+----------------+---------------------+----------------+----------------+---------------------+