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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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