Текущее время: Чт, авг 07 2025, 18:55

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: помогите с LEFT OUTER JOIN
СообщениеДобавлено: Вс, июн 28 2015, 18:05 
Начинающий
Начинающий

Зарегистрирован:
Пт, июл 25 2014, 16:00
Сообщения: 24
Доброго всем дня!
Изучаю Абап недавно и столкнулся со следующей проблемой на демонстрационной схеме :
- необходимо вывести список всех авиакомпаний и количество рейсов по ним ( если нет ни одного рейса количество должно = 0 )
Применил left outer join.

select scarr~carrid scarr~carrname sflight~connid count(*)
into (scarr-carrid, scarr-carrname, sflight-connid, cnt)
from scarr left outer join sflight
on sflight~CARRID = scarr~carrid
where sflight~price is not null
group by scarr~carrid scarr~carrname sflight~connid .

write : / scarr-carrid, scarr-carrname,sflight-connid, cnt.
endselect.

Появляется ошибка No fields from the right-hand table of a LEFT OUTER JOIN may appear in the WHERE condition: "SFLIGHT~CARRID".
Т.е нельзя накладывать ограничения на "правую " таблицу, но без ограничения sflight~price is not null
СУБД возвращает count = 1 для авиакомпаний, у которых нет рейсов ( нет связанных записей в sflight).

Подскажите обходной вариант, если кто сталкивался


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

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
может inner join подойдёт?

ps: в версии sap_aba 740 - в новом синтаксисе opensql,
уже можно накладывать ограничения на правую в left join


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: помогите с LEFT OUTER JOIN
СообщениеДобавлено: Пн, июн 29 2015, 00:07 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
AlexSm
Вообще в таком случае следует использовать другой вариант count. Нужно брать count( distinct имя_поля). Но у вас вообще задача какая-то мутная. С помощью указанного вами запроса будет отбираться не кол-во рейсов у авиакомпании, а количество рейсов в расписании. Рейсы авиакомпании находятся в таблице SPFLI, в SFLIGHT - расписание рейсов.
Т.е. если бы мен было нужно узнать количество рейсов в каждой авиакомпании, запрос был бы такой
Code:
TYPES
  : BEGIN OF tscarr
    , carrid  TYPE scarr-carrid
    , cnt     TYPE i
  , END OF tscarr

  , t_scarr TYPE TABLE OF tscarr
  .
DATA
      : gt_scarr TYPE t_scarr
      .

START-OF-SELECTION.    .

  SELECT scarr~carrid COUNT( DISTINCT connid ) as cnt
    INTO CORRESPONDING FIELDS OF table gt_scarr
    FROM scarr
      LEFT OUTER JOIN spfli
        ON spfli~carrid = scarr~carrid
    group by scarr~carrid.

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите с LEFT OUTER JOIN
СообщениеДобавлено: Пн, июн 29 2015, 19:32 
Начинающий
Начинающий

Зарегистрирован:
Пт, июл 25 2014, 16:00
Сообщения: 24
Кодер написал(а):
AlexSm
Вообще в таком случае следует использовать другой вариант count. Нужно брать count( distinct имя_поля). Но у вас вообще задача какая-то мутная. С помощью указанного вами запроса будет отбираться не кол-во рейсов у авиакомпании, а количество рейсов в расписании. Рейсы авиакомпании находятся в таблице SPFLI, в SFLIGHT - расписание рейсов.
Т.е. если бы мен было нужно узнать количество рейсов в каждой авиакомпании, запрос был бы такой
Code:
TYPES
  : BEGIN OF tscarr
    , carrid  TYPE scarr-carrid
    , cnt     TYPE i
  , END OF tscarr

  , t_scarr TYPE TABLE OF tscarr
  .
DATA
      : gt_scarr TYPE t_scarr
      .

START-OF-SELECTION.    .

  SELECT scarr~carrid COUNT( DISTINCT connid ) as cnt
    INTO CORRESPONDING FIELDS OF table gt_scarr
    FROM scarr
      LEFT OUTER JOIN spfli
        ON spfli~carrid = scarr~carrid
    group by scarr~carrid.


правильно понимаю, что имели ввиду вот это:

TYPES
: BEGIN OF tscarr,
carrid TYPE scarr-carrid,
cnt TYPE i,
END OF tscarr.

DATA : t_scarr TYPE TABLE OF tscarr,
gt_scarr TYPE tscarr.


START-OF-SELECTION.

SELECT scarr~carrid COUNT( DISTINCT connid ) as cnt
INTO CORRESPONDING FIELDS OF table t_scarr
FROM scarr
LEFT OUTER JOIN spfli
ON spfli~carrid = scarr~carrid
group by scarr~carrid.

Loop at t_scarr into gt_scarr.
write : / gt_scarr-carrid , gt_scarr-cnt.
endloop.

В таком варианте все верно. Возможно я ошибся в бизнес описании задачи, но суть сводиться к тому, что нужно сделать выборку именно из scarr и sflight.
В sflight нет такой одной колонки , которая была однозначным ключом. Как в такой ситуации поступить ?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: помогите с LEFT OUTER JOIN
СообщениеДобавлено: Пн, июн 29 2015, 19:38 
Начинающий
Начинающий

Зарегистрирован:
Пт, июл 25 2014, 16:00
Сообщения: 24
trop написал(а):
может inner join подойдёт?

ps: в версии sap_aba 740 - в новом синтаксисе opensql,
уже можно накладывать ограничения на правую в left join


попробовал на 740

select scarr~carrid scarr~carrname sflight~connid count(*)
into (scarr-carrid, scarr-carrname, sflight-connid, cnt)
from scarr left outer join sflight
on sflight~CARRID = scarr~carrid
where sflight~connid is not null
group by scarr~carrid scarr~carrname sflight~connid .

write : / scarr-carrid, scarr-carrname,sflight-connid, cnt.
endselect.

Выдает The elements in the "SELECT LIST" list must be separated using commas.

Погуглил - оказалось , что в доках есть замечательная фраза : " In outer joins, all comparisons that contain columns from the database table or view dbtab_right on the right side (as an operand) must be specified in the associated join condition. These columns are not allowed as operands in the WHERE condition of the same SELECT statement. "

В абапе недавно и не совсем понимаю, что от меня хотят ?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: помогите с LEFT OUTER JOIN
СообщениеДобавлено: Пн, июн 29 2015, 20:42 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
AlexSm
Хорошо, раз у вас версия 7.4, то попробуйте вариант из вот этого хелпа. У меня нет под рукой системы 7.4, не могу сам проверить сейчас. Если верить хелпу, то можно через && объединить столбцы и проверять уже их значения. Т.е. я бы попробовал count( sflight~connid && sfligth~fldate )
Если завтра будет время - проверю на 7.4

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


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

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
компилятор увидел доп. ограничения на правую таблицу и требует новый синтаксис opensql,
в select поля через запятую, а к переменным добавляется @


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: помогите с LEFT OUTER JOIN
СообщениеДобавлено: Вт, июн 30 2015, 09:56 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
проверил в 7.4. К сожалению, в текущем синтаксисе объединение ключевых полей таких типов недоступно (возможно я что-то пропустил, и более опытные спецы в 7.4 смогут найти обходной вариант).
Я бы еще попробовал как вариант создание CDS VIEW на join. Так чтобы оно подсчитывало количество рейсов в расписании рейсов в разрезе "авиакомпания-рейс". А в программе бы уже выбирал данные из этой вьюхи.

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите с LEFT OUTER JOIN
СообщениеДобавлено: Вт, июн 30 2015, 10:14 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
AlexSm написал(а):
В абапе недавно и не совсем понимаю, что от меня хотят ?

Хотят, чтобы условие sflight~connid is not null было перенесено из WHERE в ON.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите с LEFT OUTER JOIN
СообщениеДобавлено: Вт, июн 30 2015, 16:10 
Начинающий
Начинающий

Зарегистрирован:
Пт, июл 25 2014, 16:00
Сообщения: 24
Удав написал(а):
AlexSm написал(а):
В абапе недавно и не совсем понимаю, что от меня хотят ?

Хотят, чтобы условие sflight~connid is not null было перенесено из WHERE в ON.


в случае с outer join в ON нельзя использовать IS


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: помогите с LEFT OUTER JOIN
СообщениеДобавлено: Вт, июн 30 2015, 21:38 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
AlexSm написал(а):
в случае с outer join в ON нельзя использовать IS

Используйте <> space вместо IS NOT NULL.
В SAP рулят пробелы, особенно в ключевых полях.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

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


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

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


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

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