Как заменить условие в левом соединении с помощью предложения where? - PullRequest
0 голосов
/ 06 февраля 2020

Попытка получить тот же результат, используя предложение where вместо левого соединения

Схема TableA:

id
name
created_by

Схема TableB:

id 
name
updated_by

Пример таблицы A

id  name    created_by
1   pen      a
2   paste    k

Пример таблицы B

id  name        updated_by
1   inkpen      b
1   ballpen     c

Запрос с слева объединение

select tablea.id, tableb.id, tablea.name, tableb.name
from tablea
    left join tableb on tableb.id = tablea.id and tableb.updated_by = 'a'

Результат

tablea.id       tableb.id       tablea.name     tableb.name
    1            NULL               pen           NULL

Запрос с использованием , где Предложение:

select tablea.id, tableb.id, tablea.name, tableb.name
from tablea left join tableb
ON tableb.id = tablea.id WHERE tableb.updated_by = 'a'

Результат

tablea.id       tableb.id       tablea.name     tableb.name
    NULL             NULL           NULL              NULL

Мы использовали функцию до того, как передали user_id. Функция, в свою очередь, вернула таблицу и использовала user_id в левом соединении. Поскольку функция не использовала индексы, мы решили вместо этого использовать представления. Однако в представлениях мы не можем передавать переменные. Следовательно, мы не смогли использовать tableb.updated_by в левом соединении, поэтому попытались выполнить тот же запрос в предложении where.

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

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Ваши настоящие таблицы, вероятно, выглядят так (первичные ключи выделены жирным шрифтом):

  • item ( item_id , name, creat_by_user_id)
  • itemuserupdate ( item_id, updated_by_user_id , имя)
  • пользователи ( user_id , имя)

Что вы можете сделать, это сначала получить все комбинации пользователь / элемент, а затем external присоединиться к существующим записям:

create myview as
select i.item_id, i.name, u.user_id, iu.name as name_by_user
  i.item_id,
  u.user_id,
from users u
cross join item i
left outer join itemuserupdate iu on iu.itemid = i.itemid
                                 and iu.updated_by_user_id = u.user_id;

Затем вы используете это представление с

select item_id, name, name_by_user from myview where user_id = 123;
0 голосов
/ 06 февраля 2020

Как я могу написать запрос так, чтобы я мог получить тот же результат, что и в левом соединении через предложение where?

Вы не можете.

Условия в условии ON для LEFT JOIN, если они не выполнены, объединяют строку первой таблицы со значениями NULL, заменяя строку из второй таблицы. Если эти условия появляются в предложении WHERE, они исключают первую строку, если они не выполнены. Это эффективно превращает ваш LEFT JOIN в обычный внутренний JOIN.

...