MySQL: почему в LEFT JOIN выбираются строки с NULL, а ON xy NOT NULL - PullRequest
1 голос
/ 21 октября 2019

Вот запрос:

SELECT a.name as Employee, b.name as Manager from Employee as a
LEFT JOIN Employee as b
ON a.ManagerId = b.Id AND a.ManagerId IS NOT NULL
WHERE 1

Он работает на этой таблице:

+----+-------+--------+-----------+
| Id | Name  | Salary | ManagerId |
+----+-------+--------+-----------+
| 1  | Joe   | 70000  | 3         |
| 2  | Henry | 80000  | 4         |
| 3  | Sam   | 60000  | NULL      |
| 4  | Max   | 90000  | NULL      |
+----+-------+--------+-----------+

По идее этот запрос должен показывать всех работодателей. Набор строк, имеющих a.ManagerId = b.Id.

И все работает нормально, кроме строк

Sam, NULL Max, NULL

Почему эти строки возвращают,Если я установлю a.ManagerId is NOT NULL в предложении ON.

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Когда писал запрос

SELECT x from A
LEFT JOIN B
ON  A.b_id = b.id

Вся таблица A выбрана с подключением к B. Но используется All A.

В случае примера A и B таблицы совпадают, нО ТЕМ НЕМЕНЕЕ. У нас есть полный список таблицы A, в которой к каждой строке прикреплена или не присоединена одна строка таблицы B.

Таким образом, чтобы уменьшить количество строк в таблицах A, необходимо управлять им с помощью WERE CLAUSE

Правильный запрос будет

SELECT a.name as Employee, b.name as Manager from Employee as a
LEFT JOIN Employee as b
ON a.ManagerId = b.Id  
WHERE a.ManagerId IS NOT NULL
  1. ON, используемый для определения правил, которые строки присоединяют к таблице.
  2. WERE предложение фильтрует строки из шага 1. Вдругими словами «вырезать» некоторые строки из таблицы A, в этом примере.

Когда я использую ON FAlSE: он просто выбирает все строки из A и не объединяет строки B.

SELECT a.name as Employee from Employee as a
LEFT JOIN Employee as b
ON false
WHERE 1
  • Джо
  • Генри
  • Сэм
  • Макс

Когда я использую ON TRUE, он использует ВСЕ A строк B раз.

SELECT a.name as Employee from Employee as a
LEFT JOIN Employee as b
ON true
WHERE 1
{"headers": ["Employee"], "values": 
[
["Joe"], ["Henry"], ["Sam"], ["Max"], 
["Joe"], ["Henry"], ["Sam"], ["Max"],
["Joe"], ["Henry"], ["Sam"], ["Max"], 
["Joe"], ["Henry"], ["Sam"], ["Max"]]}
0 голосов
/ 21 октября 2019
 a.Manager IS NOT NULL 

ссылается на псевдоним таблицы Employee a вместо значения NULL ссылаются на таблицу псевдонимов Employee b

Псевдоним для таблицы используется в качестве связанных строк, принадлежащих новойотдельная таблица

В sql это типично, когда вам нужны значения из исходной таблицы для различного использования и объединения

Вы должны думать в строке таблицы как наборы данных, а псевдоним - это отдельный наборте же данные

...