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

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

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

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

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

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Вопрос по SQL-запросу
    #39383086
Zilberstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Вопрос по SQL-запросу
    #39383103
Zilberstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вернее

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
Вопрос по SQL-запросу
    #39383230
Zilberstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, все получилось)
...
Рейтинг: 0 / 0
Вопрос по SQL-запросу
    #39383250
Фотография Владимир П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вопрос по SQL-запросу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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