SQL Left join - Фиксированное значение из правой таблицы - PullRequest
1 голос
/ 03 апреля 2020

У меня есть 2 таблицы, скажем, A и B. Как часть существующего процесса, он работает примерно так

Select A.a, B.b
from A left join B
on A.c=B.C
and B.b = 'xyz'

Теперь, из-за определенного c требования, мне нужно иметь Bb = 'xyz' в предложении where. Нечто подобное .

1 Ответ

4 голосов
/ 03 апреля 2020

Вы не можете. Ну, вы можете, если вы используете подзапрос в предложении from:

select A.a, B.b
from A left join
     (select B.*
      from B
      where B.b = 'xyz'
     ) B
     on A.c = B.C;

Вы также можете использовать коррелированный подзапрос, если только одна строка соответствует ::

select A.a,
       (select B.b
        from B
        where A.c = B.C and B.b = 'xyz'
       ) B
from A;

Или, Вы можете «объединить все» в дополнительных результатах:

select A.a, B.B
from A left join
     B
     on A.c = B.C
where B.b = 'xyz'
union all
select A.a, NULL
from A
where not exists (select 1 from B A.c = B.C and B.b = 'xyz')

Заманчиво написать:

select A.a, B.b
from A left join
     B
     on A.c = B.C
where B.b = 'xyz' or B.b is null;

Однако, это не тот же лог c. Обратите внимание:

A

A    C
1    1
2    2

B

B     C
xyz   1
abc   1
abc   2

Возвращается версия левого соединения:

1    xyz
2    null

Возвращается версия where:

1    xyz

Строка "2" отфильтрована, поскольку имеется совпадение с другим значением.

...