Right Outer Join не работает после вставки строки - PullRequest
0 голосов
/ 31 октября 2019

У меня есть 2 таблицы со следующими данными

ManualVersions - список всех ручных версий

+------------------+---------------+--------------+
|Id   | ManualID   | VersionNumber |  VersionName |
+-----+------------+---------------+--------------+
|10   |   12       |   1.0         |   Version 1  |
|17   |   12       |   2.0         |   Version 2  |

CustomersManuals - Это позволяет мне узнать, какой клиент имеет доступ к каким ручным версиям

+---+---------------+--------------------+
|Id | CustomerID    |  ManualVersionsID  |
+-- +---------------+--------------------+
|4  | 19            |     10             |
|8  | 24            |     10             |

Цель состоит в том, чтобы написать запрос, который позволит мне узнать, к каким ручным версиям клиент имеет доступ и не имеет доступа к нему.

Для этого я запускаю следующий sql для вышеуказанных таблиц.

Select CustomersManuals.id as CustomerManualsID, ManualVersions.VersionNumber, ManualVersions.VersionName, ManualVersions.id as ManualVersionID
FROM CustomersManuals
RIGHT OUTER JOIN ManualVersions ON CustomersManuals.ManualVersionsID = ManualVersions.id
WHERE (CustomersManuals.CustomerID=24 OR CustomersManuals.CustomerID iS NULL) AND ManualVersions.ManualID = 12

Результаты сверху SQL

+-------------------+--------------+---------------+----------------+
|CustomerManualsID  | VersionNumber| VersionName   | ManualVersionID|
+-------------------+--------------+---------------+----------------+
| 8                 | 1.0          | Version 1     | 10             |
| NULL              | 2.0          | Version 2     | 17             |

Вышеприведенное верно и делает то, что я хочу. Возвращается значение NULL, показывающее, что customerID 24 не имеет руководства 2.

Если я сейчас вставлю следующую строку в таблицу CustomersManuals, приведенный выше SQL не будет работать

CustomersManuals (строка, в которую я вставлен)

+----+------------+------------------+
| Id | CustomerID | ManualVersionsID |
+----+------------+------------------+
|30  | 18         | 17               |

Приведенный выше sql теперь возвращает только 1 строку

+-------------------+---------------+---------------+---------------------+
| CustomerManualsID | VersionNumber | VersionName   |   ManualVersionID   |
+-------------------+---------------+---------------+---------------------+
|  8                |  1.0          | Version 1     |   10                |

Обратите внимание, что в приведенной выше таблице пропущена строка с нулевым значением CustomerManualsID.

Есть ли способпоказать все руководства, которые есть у клиента, и все, что у него нет?

Ответы [ 2 ]

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

Увеличивая ответ Бармара, было бы более привычным написать это ...

Select m.id CustomerManualsID
     , v.VersionNumber
     , v.VersionName
     , v.id ManualVersionID
  FROM ManualVersions v
  LEFT
  JOIN CustomersManuals m 
    ON m.ManualVersionsID = v.id 
   AND m.CustomerID = 24
 WHERE v.ManualID = 12
0 голосов
/ 31 октября 2019

Положите условия для дочерней таблицы в предложении ON, а не WHERE. Тогда вам не нужно явно тестировать NULL.

Select CustomersManuals.id as CustomerManualsID, ManualVersions.VersionNumber, ManualVersions.VersionName, ManualVersions.id as ManualVersionID
FROM CustomersManuals
RIGHT OUTER JOIN ManualVersions ON CustomersManuals.ManualVersionsID = ManualVersions.id AND CustomersManuals.CustomerID=24
WHERE ManualVersions.ManualID = 12

DEMO

...