Внутренняя работа самостоятельного объединения в сочетании с ГДЕ - PullRequest
0 голосов
/ 01 мая 2019

У меня есть таблица

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

Я хочу найти все контакты компании, в которой работает Джим Джонс.Это правильный набор.

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

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Чтобы получить объяснение, сделайте следующее:

1) сделайте видимой другую таблицу (самостоятельное объединение), чтобы увидеть результат, который вы фактически получите при объединении без предложения where:

выберите A.contactid, A.company, A.contact, B.contactid, B.company, B.contact из контактов. Внутреннее соединение контактов B на A.company = B.company

self joined tables

2) добавьте предложение WHERE и обменяйте A.contact на B.contact, чтобы увидеть, что происходит

1 голос
/ 01 мая 2019

Вы можете использовать этот способ для получения желаемого результата.

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