Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вопрос по SQL-запросу / 9 сообщений из 9, страница 1 из 1
12.01.2017, 11:41
    #39382990
Zilberstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по SQL-запросу
Добрый день.
Имеется БД информационной системы(система содержит объекты с какими-то атрибутами):
table1 - список объектов
table2 - список шаблонов атрибутов объектов
table3 - все значения атрибутов объектов(связь объекта, шаблона атрибута + значение атрибута).

Если значение атрибута объекта не инициализировано, то есть не было заполнено пользователем при создании или редактировании объекта, то table3 не содержит строки, соответствующей данному значению.

допустим всего существует 15 объектов, одно из значений атрибута заполнено лишь у 10 из них.
Делаю обычный sql-запрос: несколько join для каждого из нужных атрибутов - в результате получаю только 10 записей.

Каким образом можно получить все 15 записей с пустым полем значения, если соответствующей записи значения атрибута нет в таблице teble3?
...
Рейтинг: 0 / 0
12.01.2017, 12:05
    #39383006
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по SQL-запросу
Делайте left join вместо inner join.
...
Рейтинг: 0 / 0
12.01.2017, 12:12
    #39383016
Zilberstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по SQL-запросу
Melkij,
делал, не помогает ни left, ни full
...
Рейтинг: 0 / 0
12.01.2017, 12:20
    #39383019
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по SQL-запросу
Тогда показывайте, как делали.
Может, какую очевидную ошибку вроде попытки where по left join таблице без учёта null, что, разумеется, вырождает left join в inner join.
...
Рейтинг: 0 / 0
12.01.2017, 12:31
    #39383032
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по SQL-запросу
MelkijТогда показывайте, как делали.
Может, какую очевидную ошибку вроде попытки where по left join таблице без учёта null, что, разумеется, вырождает left join в inner join.

Тут походу EAV очередной. Без понимания как SQL писать да. Тяжелый случай.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
12.01.2017, 13:10
    #39383086
Zilberstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по SQL-запросу
MelkijТогда показывайте, как делали.
Может, какую очевидную ошибку вроде попытки where по left join таблице без учёта null, что, разумеется, вырождает left join в inner join.

Да,

select
table1.id,

from table1
left join table3 as atr1 on atr1.owner = table1.id
left join table2 as templ1 on templ1.id = atr1.templ_id
left join table3 as atr2 on atr2.owner = table1.id
left join table2 as templ2 on templ2.id = atr2.templ_id

where templ1.id = 'id1'
and templ2.id = 'id2'

Атрибут id2 заполнен не у всех объектов.
...
Рейтинг: 0 / 0
12.01.2017, 13:18
    #39383103
Zilberstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по SQL-запросу
вернее

select
table1.id,
atr1.content,
atr2.content

from table1
left join table3 as atr1 on atr1.owner = table1.id
left join table2 as templ1 on templ1.id = atr1.templ_id
left join table3 as atr2 on atr2.owner = table1.id
left join table2 as templ2 on templ2.id = atr2.templ_id

where templ1.id = 'id1'
and templ2.id = 'id2'
...
Рейтинг: 0 / 0
12.01.2017, 15:07
    #39383230
Zilberstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по SQL-запросу
Спасибо, все получилось)
...
Рейтинг: 0 / 0
12.01.2017, 15:23
    #39383250
Владимир П.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по SQL-запросу
Zilbersteinselect
table1.id,
atr1.content,
atr2.content

from table1
left join table3 as atr1 on atr1.owner = table1.id
left join table2 as templ1 on templ1.id = atr1.templ_id
left join table3 as atr2 on atr2.owner = table1.id
left join table2 as templ2 on templ2.id = atr2.templ_id

where templ1.id = 'id1'
and templ2.id = 'id2'

Атрибут id2 заполнен не у всех объектов.

Надо так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select
table1.id,
atr1.content,
atr2.content

from table1 
left join table3 as atr1 on atr1.owner = table1.id
left join table2 as templ1 on templ1.id = atr1.templ_id
left join table3 as atr2 on atr2.owner = table1.id
left join table2 as templ2 on ( templ2.id = atr2.templ_id and templ2.id = 'id2')

where templ1.id = 'id1'



Тут важно, чтобы условие, в котором задействован пустой столбец, попало в условие внешнего соединения.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вопрос по SQL-запросу / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]