Текущее время: Пн, июл 28 2025, 02:10

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Проблемма с LEFT JOIN...
СообщениеДобавлено: Пн, июл 07 2008, 11:45 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, авг 10 2006, 08:44
Сообщения: 320
Откуда: Odessa
Есть такой селект:

SELECT
TAB_1~f1
TAB_2~g1
TAB_2~g2
TAB_2~g3
TAB_3~s1
INTO (rf1, rg1, rg1, rg1, rs1)
FROM ZDTAB_1 AS TAB_1
JOIN ZDTAB_2 AS TAB_2
ON TAB_1~f1 = TAB_2~g4
LEFT JOIN ZDTAB_3 AS TAB_3
ON TAB_3~s2 = TAB_2~g3

WHERE TAB_1~f2 like '2008%' AND
TAB_3~s1 <> SPACE
.

ENDSELECT.

Ошибка:
No fields from the right-hand table of a LEFT OUTER JOIN may appear in
the WHERE condition: "TAB_3~s1".

Подскажите в чем проблема :?:


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемма с LEFT JOIN...
СообщениеДобавлено: Пн, июл 07 2008, 11:55 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Пн, янв 24 2005, 16:22
Сообщения: 749
Пол: Мужской
Primat написал(а):
Есть такой селект:

SELECT
TAB_1~f1
TAB_2~g1
TAB_2~g2
TAB_2~g3
TAB_3~s1
INTO (rf1, rg1, rg1, rg1, rs1)
FROM ZDTAB_1 AS TAB_1
JOIN ZDTAB_2 AS TAB_2
ON TAB_1~f1 = TAB_2~g4
LEFT JOIN ZDTAB_3 AS TAB_3
ON TAB_3~s2 = TAB_2~g3

WHERE TAB_1~f2 like '2008%' AND
TAB_3~s1 <> SPACE
.

ENDSELECT.

Ошибка:
No fields from the right-hand table of a LEFT OUTER JOIN may appear in
the WHERE condition: "TAB_3~s1".

Подскажите в чем проблема :?:


Вы хотите воспользоваться внешним левым соединением с таблицей TAB_3. Это означает, что при соединении в этой таблице могут оказаться пустые записи, поэтому система запрещает использовать поля в условиях. Если хотите отфильтровать именно те записи, где будет не пусто (судя по условию), то соедините TAB_3 через INNER JOIN.

_________________
Счастье есть!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, июл 07 2008, 12:10 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, авг 10 2006, 08:44
Сообщения: 320
Откуда: Odessa
Я так и предполагал. Но INNER JOIN мне подходит так как:
Table 1 Table 2
|----|----|----|----| |----|----|----|----|----|
| A | B | C | D | | D | E | F | G | H |
|----|----|----|----| |----|----|----|----|----|
| a1 | b1 | c1 | 1 | | 1 | e1 | f1 | g1 | h1 |
| a2 | b2 | c2 | 1 | | 3 | e2 | f2 | g2 | h2 |
| a3 | b3 | c3 | 2 | | 4 | e3 | f3 | g3 | h3 |
| a4 | b4 | c4 | 3 | |----|----|----|----|----|
|----|----|----|----|

\ /
\ /
\ /
\ /
\/
Inner Join
|----|----|----|----|----|----|----|----|----|
| A | B | C | D | D | E | F | G | H |
|----|----|----|----|----|----|----|----|----|
| a1 | b1 | c1 | 1 | 1 | e1 | f1 | g1 | h1 |
| a2 | b2 | c2 | 1 | 1 | e1 | f1 | g1 | h1 |
| a4 | b4 | c4 | 3 | 3 | e2 | f2 | g2 | h2 |
|----|----|----|----|----|----|----|----|----|

Если оно не найдет строку в TAB_3, то не получится строки соединения TAB_1<->TAB_2? (по которой искалось TAB_3).
А мне надо TAB_1<->TAB_2 хоть и строка TAB_3 будет пуста.

А TAB_3 это к примеру документ, он есть но поле у него пустое, тогда мне эта строка не нужна.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, июл 07 2008, 12:48 
Специалист
Специалист

Зарегистрирован:
Пт, окт 20 2006, 16:39
Сообщения: 230
воспользуйтесь OpenSQL, там такой запрос прокатит


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

Зарегистрирован:
Пн, сен 17 2007, 10:48
Сообщения: 190
Откуда: Нальчик, РФ
Пол: Мужской
demst написал(а):
воспользуйтесь OpenSQL, там такой запрос прокатит


А это ли не OpenSQL? :oops:
Может Native Вы имели в виду?

_________________
С уважением, Сергей С.


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

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
ненене, нужно просто вынести t3 <> space из запроса


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, июл 07 2008, 13:08 
Специалист
Специалист

Зарегистрирован:
Пт, окт 20 2006, 16:39
Сообщения: 230
east написал:
А это ли не OpenSQL? :oops:
Может Native Вы имели в виду?


Действительно, извиняюсь :oops:
понедельник ))


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемма с LEFT JOIN...
СообщениеДобавлено: Пн, июл 07 2008, 19:46 
Президент
Президент

Зарегистрирован:
Пт, апр 28 2006, 22:39
Сообщения: 2514
Откуда: North Taxolina, USA
Пол: Женский
Primat написал(а):
Ошибка:
No fields from the right-hand table of a LEFT OUTER JOIN may appear in
the WHERE condition: "TAB_3~s1".
Подскажите в чем проблема :?:


Ну так из сообщения же ясно видно, в чем проблема. Если вы присоединяете таблицу с помощью LEFT JOIN (т.е. у вас это ZDTAB_3), то никакие поля из нее не могут фигурировать в WHERE. Т.е. ваша конструкция синтактически неправильна. Это известная засада с LEFT JOIN, лечится примерно следующим:

1) оставляем LEFT JOIN, убираем WHERE, а потом удаляем ненужные записи в полученной таблице;
2) разбиваем на два отдельных SELECT;
3) иногда можно использовать subquery (посмотрите Help на SELECT WHERE), правда с этим надо осторожно.

В общем возможны варианты, в зависимости от того, какого результата вы хотите добиться.

P.S. Кстати, давать aliases (ZDTAB_1 AS TAB_1) совершенно не обязательно, если таблица используется в JOIN один раз. Я тоже это всегда делала по началу (ну в Help же написано! :) ), а потом доперло, что можно просто писать, например ZDTAB_1~F1. Так гораздо проще разбираться, что, куда и откуда. Чистое IMHO, конечно, работать будет и так и так.

Успехов!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемма с LEFT JOIN...
СообщениеДобавлено: Вт, июл 08 2008, 07:53 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, авг 10 2006, 08:44
Сообщения: 320
Откуда: Odessa
Jelena написала:
Primat написал(а):
Ошибка:
No fields from the right-hand table of a LEFT OUTER JOIN may appear in
the WHERE condition: "TAB_3~s1".
Подскажите в чем проблема :?:


Ну так из сообщения же ясно видно, в чем проблема. Если вы присоединяете таблицу с помощью LEFT JOIN (т.е. у вас это ZDTAB_3), то никакие поля из нее не могут фигурировать в WHERE. Т.е. ваша конструкция синтактически неправильна. Это известная засада с LEFT JOIN, лечится примерно следующим:

1) оставляем LEFT JOIN, убираем WHERE, а потом удаляем ненужные записи в полученной таблице;
2) разбиваем на два отдельных SELECT;
3) иногда можно использовать subquery (посмотрите Help на SELECT WHERE), правда с этим надо осторожно.

В общем возможны варианты, в зависимости от того, какого результата вы хотите добиться.

P.S. Кстати, давать aliases (ZDTAB_1 AS TAB_1) совершенно не обязательно, если таблица используется в JOIN один раз. Я тоже это всегда делала по началу (ну в Help же написано! :) ), а потом доперло, что можно просто писать, например ZDTAB_1~F1. Так гораздо проще разбираться, что, куда и откуда. Чистое IMHO, конечно, работать будет и так и так.

Успехов!


С точки зрения оптимизации запроса(уменьшения его времени работы) первые два варианта не подходят. Все таблицы имеют >= 250 000 записей и выбрасывать какое-то условия, чревато увеличением времени отработки запроса. А по поводу 3-го пункта нужно посмотреть, но врятли я его буду применять.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемма с LEFT JOIN...
СообщениеДобавлено: Вт, июл 08 2008, 08:27 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, фев 11 2008, 11:54
Сообщения: 359
Откуда: Воронеж
Пол: Мужской
Primat написал(а):
С точки зрения оптимизации запроса(уменьшения его времени работы) первые два варианта не подходят. Все таблицы имеют >= 250 000 записей и выбрасывать какое-то условия, чревато увеличением времени отработки запроса. А по поводу 3-го пункта нужно посмотреть, но врятли я его буду применять.

Я конечно не гуру в оптимизации, но первые два варианта работают достаточно быстро, проверьте. Лично мне милее 1 вариант.
Jelena +1, subquery интересная вещь, почему раньше не использовал :)

_________________
Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем


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

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
subquery - зло


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Проблемма с LEFT JOIN...
СообщениеДобавлено: Вт, июл 08 2008, 11:43 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Primat написал(а):
С точки зрения оптимизации запроса(уменьшения его времени работы) первые два варианта не подходят. Все таблицы имеют >= 250 000 записей и выбрасывать какое-то условия, чревато увеличением времени отработки запроса. А по поводу 3-го пункта нужно посмотреть, но врятли я его буду применять.

Ну это как посмотреть...
1.Если удаляемое условие идет по полю, не входящему в индекс, то время обработки запроса увеличится только за счет бОльшего количества выбираемых записей.
2.Если вообще убрать left join, то сократится нагрузка на оптимизатор и сервер БД, но придется делать отдельный запрос по zdtab_3 по данным внутренней таблицы.
Тут все зависит от количества записей в zdtab_3 - если их мало, то легче выбирать эти записи по одной в цикле и сохранять в сортированной таблице, если много - лучше использовать for all entries по всем записям внутренней таблицы.

Не нужно забывать, что R/3 - это 3-х звенная архитектура и не нужно всю работу по выборке и обработке данных перекладывать на сервер БД.

Наглядный пример выборки по 3-м большим таблицам - связка ANLA, ANLU и ANLZ:
выделение ANLU из связки по left join в отдельную выборку сократило время выполнения отчета на 30%

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемма с LEFT JOIN...
СообщениеДобавлено: Вт, июл 08 2008, 18:20 
Президент
Президент

Зарегистрирован:
Пт, апр 28 2006, 22:39
Сообщения: 2514
Откуда: North Taxolina, USA
Пол: Женский
Primat написал(а):
Все таблицы имеют >= 250 000 записей и выбрасывать какое-то условия, чревато увеличением времени отработки запроса.


Ну, в таком случае наверное имеет место, пардон, ситуация "как не ложись - все равно отымеют". Кстати, раз уж таблицы Z, то может вообще надо бы их дизайн пересмотреть? :?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, июл 08 2008, 18:46 
Специалист
Специалист

Зарегистрирован:
Ср, мар 28 2007, 11:02
Сообщения: 132
Откуда: SPb
Особенно актуален пересмотр дизайна таблицы > 250к записей :D
Прошу прощения за офтоп - очень ветка понравилась ))
Jelena, спасибо за
Цитата:
P.S. Кстати, давать aliases (ZDTAB_1 AS TAB_1) совершенно не обязательно, если таблица используется в JOIN один раз. Я тоже это всегда делала по началу (ну в Help же написано! ), а потом доперло, что можно просто писать, например ZDTAB_1~F1. Так гораздо проще разбираться, что, куда и откуда. Чистое IMHO, конечно, работать будет и так и так.
[/quote]

_________________
С уважением, СашОК.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемма с LEFT JOIN...
СообщениеДобавлено: Ср, июл 09 2008, 09:22 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Вс, сен 02 2007, 15:10
Сообщения: 670
Откуда: Moscow
Jelena написала:
Если вы присоединяете таблицу с помощью LEFT JOIN (т.е. у вас это ZDTAB_3), то никакие поля из нее не могут фигурировать в WHERE.
А никто не знает, почему такое ограничение? В других реализациях SQL вроде бы такого нет.
Т.е. есть ли некий практически разумный смысл в этом ограничениии или просто так исторически сложилось?

_________________
Если кризис ведет к очищению, то удар битой по голове должен вести к просветлению. (с) Я.


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

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


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

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


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

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