Текущее время: Сб, июл 26 2025, 20:48

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 35 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Два LEFT JOIN в SELECT'е
СообщениеДобавлено: Ср, июн 14 2006, 19:40 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, апр 05 2005, 17:02
Сообщения: 70
У меня есть 3 таблицы:
1) Лицо
- Face с полями id и fio
2) Роль
- role с полями id, face_id и description
3) Доверенность на исполнение роли
- dover с полями face_id, role_id и num

Для построения отчёта мне нужно связать эти табдицы примерно так:
Code:
select xxx  into yyy
  from face
  left join role  on face~id = role~face_id
  left join dover on face~id = dover~face_id and
                     role~id = dover~role_id.

на такой селект САП ругается: к одной таблице может быть тока 1 аутер джоин. (что, собственно, правильно и ожидаемо)
Посоветуйте, что мне надо сделать, чтоб получить обвязку именно 3-х таблиц


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 14 2006, 20:47 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, июн 06 2006, 17:38
Сообщения: 130
Если таблицы роль и доверенность относительно маленькие, то между ними inner join, а потом уже внешняя связка на лицо. Если большие и томозит, то лучше через внутренюю заморочиться.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 14 2006, 21:32 
Старший специалист
Старший специалист

Зарегистрирован:
Пт, ноя 12 2004, 10:44
Сообщения: 370
Откуда: Москва
мусульманин написал(а):
Если таблицы роль и доверенность относительно маленькие, то между ними inner join, а потом уже внешняя связка на лицо. Если большие и томозит, то лучше через внутренюю заморочиться.


я извиняюсь, а разве направление left join'а не влияет на результат выборки? в предложенном случае, мы не получим лиц без роли и/или доверенности... inner join лучше тоже не делать.. лучше выбрать лиц во внутреннюю таблицу. а потом делать выборку, ну например, используя for all entries in... 3 select'а подряд...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 15 2006, 08:29 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, апр 05 2005, 17:02
Сообщения: 70
Да, таблицы небольшие, так что буду зачитывать лиц в внутреннюю таблицу и далее ещё 2 селекта.
Спасибо


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 15 2006, 08:51 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, апр 05 2005, 17:02
Сообщения: 70
Правда, возникает один неприятный момент. Таблицы лица и роли имеют отношение один-ко-многим. Соответственно, придётся ещё писать код для размножения результирующих строк
:(


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 15 2006, 09:02 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
удалил сообщение. не внимательно вопрос прочитал.


Последний раз редактировалось vga Пт, июн 16 2006, 20:48, всего редактировалось 6 раз(а).

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: re
СообщениеДобавлено: Чт, июн 15 2006, 09:11 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
если отношения такие:
роль-доверенносить 1-1
лицо-роль 1-N

попробуй:

select
...
from role
inner join dover ...
left join face ..

получится 3 в 1: роль - доверенность - [лицо]

после запроса выкинь строчки без лица, если тебе доверенности к лицам надо


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 15 2006, 09:33 
Директор
Директор

Зарегистрирован:
Чт, май 12 2005, 11:10
Сообщения: 1038
Пол: Мужской
Скажите, коллеги, разве по умолчанию JOIN не LEFT - или я чтото пропутсил ? (в том смысле что RIGHT JOIN-а в стандарте SQLя нет - и это все изобретения производителей, например Microsoft-а)

И мне думается inner join - тоесть 1:1 - можно заменить на самодельный view. Тогда select будет из двух таблиц.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 15 2006, 09:53 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
Egal написал:
Скажите, коллеги, разве по умолчанию JOIN не LEFT - или я чтото пропутсил ? (в том смысле что RIGHT JOIN-а в стандарте SQLя нет - и это все изобретения производителей, например Microsoft-а)


outer join по умолчанию left
а так вообще - join по умолчанию inner

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 15 2006, 09:54 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, апр 05 2005, 17:02
Сообщения: 70
Цитата:
если отношения такие:
роль-доверенносить 1-1
лицо-роль 1-N

Отношения такие
лицо-роль 1-N
лицо+роль - доверенность 1-N
т. е. доверенность выдаётся лицу на исполнение определённой роли на указанный срок. Срок закончился, может быть выдана новая доверенность

Цитата:
Скажите, коллеги, разве по умолчанию JOIN не LEFT - или я чтото пропутсил ? (в том смысле что RIGHT JOIN-а в стандарте SQLя нет - и это все изобретения производителей, например Microsoft-а)

Насколько я помню, по умолчанию JOIN = OUTER JOIN. А это не совсем LEFT :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 15 2006, 10:19 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
Вольдемар написал(а):
Насколько я помню, по умолчанию JOIN = OUTER JOIN. А это не совсем LEFT :)


inner, уважаемый, inner :P

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 15 2006, 11:55 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Вот так заработает
Code:
select xxx  into yyy
  from dover 
  inner join role on role~role_id = dover~role_id
  inner join face on face~id = role~face_id
  where ...

В данном случае именно таблица dover объединяет роли и людей, причем в отношении 1:N, где N > 0.
LEFT OUTER JOIN нужен только при отношении 1:CN, где CN >= 0.
Зачем Вам доверенности, не выданные на пустую роль или на несуществующего человека? :)

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 15 2006, 13:07 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, апр 05 2005, 17:02
Сообщения: 70
Удав написал(а):
Вот так заработает
Code:
select xxx  into yyy
  from dover 
  inner join role on role~role_id = dover~role_id
  inner join face on face~id = role~face_id
  where ...

В данном случае именно таблица dover объединяет роли и людей, причем в отношении 1:N, где N > 0.
LEFT OUTER JOIN нужен только при отношении 1:CN, где CN >= 0.
Зачем Вам доверенности, не выданные на пустую роль или на несуществующего человека? :)

Прекрасно, но увижу ли я таким образом лиц, не играющих ни одной роли, или действующих без доверенностей (на хрена ген.директору доверенность? ;) )?!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 15 2006, 13:27 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Для этого есть другие запросы:
Code:
select *
from roles
where not exists ( select * from dover
                           where dover~role_id = roles~role_id )

и
Code:
select *
from face
where not exists ( select * from dover
                           where dover~face_id = face~face_id )


:lol:

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июн 15 2006, 13:54 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, апр 05 2005, 17:02
Сообщения: 70
Короче, всё снова свелось к последовательности селектов
:)
Всё равно спасибо, появились некоторые идеи для других работ


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 35 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB