Оставлено соединение для 3 таблиц с Где не работает, как ожидалось - PullRequest
0 голосов
/ 18 мая 2018

У меня есть 2 таблицы, такие как:

Versions         Names                        Cell
ID Version       ID   Name   Indicator        ID   Number
1   1.0          1    Joe     Y               1    1234 
2   1.1          1    Black   N               2    5678 
3   1.2          2    David   N               3    4786
4   2.0          2    Troy    N
                 2    George  Y

Ожидаемый вывод

ID  Number       Version   Name   Indicator   
1   1234         1.0       Joe     Y             
2   5678         1.1       George  Y          
3   4786         1.2       NULL    NULL       

Я хочу получить

  1. все записи из «Версии»таблица с «Version», начинающейся с «1» и
  2. с «Name» и «Indicator» как «Y» из таблицы «Names» для записей из # 1 и
  3. «Number»из таблицы "Ячейка" из # 1

Я думаю, что мне нужно левое соединение.Это не дает мне ожидаемый результат.Куда я иду не так?

   SELECT a.ID, b.Number, a.Version, c.Name, c.Indicator
   FROM Version a LEFT JOIN Cell b ON a.ID = b.ID
   LEFT JOIN Names c ON a.ID = c.ID
   WHERE a.Version LIKE '1%' AND c.Indicator = 'Y'

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Я отвечаю по двум причинам:

  • Я думаю, что условие version неверно.
  • Исправьте псевдонимы таблицы.

Итак, я думаю, что вы действительно хотите:

SELECT v.ID, c.Number, v.Version, n.Name, n.Indicator
FROM Version v LEFT JOIN
     Cell c
     ON v.ID = c.ID LEFT JOIN
     Names n
     ON v.ID = n.ID AND n.Indicator = 'Y'
WHERE v.Version LIKE '1.%';

Причина . в том, что предложение WHERE не соответствует 11.0 или 101.3.

причина изменения псевдонимов таблиц заключается в том, что выполнить запрос с аббревиатурами таблиц гораздо проще.

0 голосов
/ 18 мая 2018

Применение условия к таблице «внешнего соединения» в предложении WHERE фактически превращает внешнее соединение во внутреннее соединение, потому что каждая строка, которая сохраняется внешним соединением, будет содержать значение null в этом столбце,но условие c.Indicator = 'Y' в предложении where снова удалит эти строки.

Чтобы это исправить, переведите c.Indicator = 'Y' в состояние соединения:

SELECT a.ID, b.Number, a.Version, c.Name, c.Indicator
FROM Version a 
  LEFT JOIN Cell b ON a.ID = b.ID
  LEFT JOIN Names c ON a.ID = c.ID AND c.Indicator = 'Y'
WHERE a.Version LIKE '1%' 
...