自连接的内部工作与WHERE结合

问题描述 投票:0回答:2

我有一张桌子

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
sql inner-join self-join
2个回答
1
投票

您可以使用这种方式获得所需的结果。

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          |
+-----------------+----------------+---------------------+----------------+----------------+---------------------+

2
投票

要获得解释,请执行以下操作:

1)使另一个表(自联接)可见,以查看在没有where子句的情况下加入时实际获得的结果:

选择A.contactid,A.company,A.contact,B.contactid,B.company,B.contact from contacts A within join contacts B on A.company = B.company

self joined tables

2)现在添加你的WHERE子句并与B.contact交换A.contact以查看会发生什么

© www.soinside.com 2019 - 2024. All rights reserved.