SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

SELECT * и JOIN



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
den
Старший специалист
Старший специалист



Joined: 11 Oct 2007
Posts: 103

PostPosted: Wed Feb 04, 2009 4:42 pm    Post subject: SELECT * и JOIN Reply with quote

Здравствуйте, допустим ли такой запрос со звездочкой в select?

Code:
** PO ITEM data **
  DATA gt_ekpo TYPE TABLE OF ekpo.
  SELECT *
  INTO CORRESPONDING FIELDS OF TABLE gt_ekpo
  FROM ekpo AS p
  INNER JOIN ekko AS k ON k~ebeln = p~ebeln
  WHERE p~ebeln   IN so_ebeln
    AND k~bstyp   IN so_bstyp
    AND k~lifnr   IN so_lifpo
    AND p~matkl   NE gs_ekpo_tpl-matkl.


Что будет, если первая и вторая таблица будут иметь одинаковые поля? Какое из полей попадет в итоговую внутреннюю таблицу?

Как избежать неоднозначности записи, не перечисляя явно все поля из первой и второй таблицы.

ЗЫ: пример с ekko и ekpo может не совсем показателен, запрос выполняется без ошибок, так как только одно ключевое поле ebeln содержится в обоих таблицах и оно всегда одинаково.
Back to top
View user's profile Send private message
ghost
Специалист
Специалист


Age: 37
Joined: 18 Jan 2008
Posts: 71
Location: Tashkent-Astana-Moscow

PostPosted: Wed Feb 04, 2009 4:57 pm    Post subject: Reply with quote

по поему в поля внутренней таблицы сядут значения из таблиц нижних жойнов(хотя сам не пробовал Very Happy ). но такая практика не приведет ни к чему хорошему. очень не предсказуемо

кстати интересно откуда такая потребность появилась ?
Back to top
View user's profile Send private message Send e-mail Blog
den
Старший специалист
Старший специалист



Joined: 11 Oct 2007
Posts: 103

PostPosted: Wed Feb 04, 2009 5:46 pm    Post subject: Reply with quote

ghost wrote:
кстати интересно откуда такая потребность появилась ?


Нужно выбрать все поля из ekpo, но фильтр в условии where накладывается и по ekko и ekpo.

Потребность только в том, чтобы не перечислять все поля из ekpo. Муторно.

А все поля нужны, чтобы потом сделать апдейт,
UPDATE ekpo FROM TABLE gt_ekpo.

изменив несколько полей по всем записям.
Back to top
View user's profile Send private message
menx
Участник
Участник



Joined: 21 Nov 2008
Posts: 25
Location: СПб - Валлдорф

PostPosted: Thu Feb 05, 2009 12:08 pm    Post subject: Reply with quote

Классический стандарт ANSI SQL92 позволяет иметь * под селектом. Не могу отвечать за все, но большинство SQL серверов принимает данную форму. В этом случае будут выданы сначала поля из первой таблицы, потом из второй. Серверу собственно все равно как этот результат будет потом интерпретирован вызывающей стороной. MSSQL, кажется, переименовывает столбец (но я тут не уверен - давно это было Smile). Поблема возникает только в случае если явно указано поле присутствующее в обеих таблицах, но при этом не указано откуда именно его брать.

Что же касается результата, то как правило возвращается последнее совпадающее по имени поле из запроса.
Back to top
View user's profile Send private message
ghost
Специалист
Специалист


Age: 37
Joined: 18 Jan 2008
Posts: 71
Location: Tashkent-Astana-Moscow

PostPosted: Thu Feb 05, 2009 1:25 pm    Post subject: Reply with quote

den wrote:
ghost wrote:
кстати интересно откуда такая потребность появилась ?


Нужно выбрать все поля из ekpo, но фильтр в условии where накладывается и по ekko и ekpo.

Потребность только в том, чтобы не перечислять все поля из ekpo. Муторно.

А все поля нужны, чтобы потом сделать апдейт,
UPDATE ekpo FROM TABLE gt_ekpo.

изменив несколько полей по всем записям.


почитайте Help F1 по SELECT

Code:
If the CORRESPONDING FIELDS addition is specified, only those contents of columns for which there are identically-named components in wa are assigned to them; alternative column names are taken into account. Columns and aggregate expressions that appear multiple times can only be assigned using alternative column names if CORRESPONDING FIELDS is specified. If a column name appears multiple times and no alternative column name was specified, the last column listed is assigned.
Back to top
View user's profile Send private message Send e-mail Blog
Удав
Гуру
Гуру


Age: 48
Joined: 25 Jan 2008
Posts: 580
Location: Москва

PostPosted: Thu Feb 05, 2009 5:53 pm    Post subject: Re: SELECT * и JOIN Reply with quote

den wrote:
Здравствуйте, допустим ли такой запрос со звездочкой в select?

Code:
** PO ITEM data **
  DATA gt_ekpo TYPE TABLE OF ekpo.
  SELECT *
  INTO CORRESPONDING FIELDS OF TABLE gt_ekpo
  FROM ekpo AS p
  INNER JOIN ekko AS k ON k~ebeln = p~ebeln
  WHERE p~ebeln   IN so_ebeln
    AND k~bstyp   IN so_bstyp
    AND k~lifnr   IN so_lifpo
    AND p~matkl   NE gs_ekpo_tpl-matkl.

Что будет, если первая и вторая таблица будут иметь одинаковые поля? Какое из полей попадет в итоговую внутреннюю таблицу?

Как избежать неоднозначности записи, не перечисляя явно все поля из первой и второй таблицы.

ЗЫ: пример с ekko и ekpo может не совсем показателен, запрос выполняется без ошибок, так как только одно ключевое поле ebeln содержится в обоих таблицах и оно всегда одинаково.

Для данного конкретного случая - использовать ракурс wb2_v_ekko_ekpo2. Поля из ekpo заканчиваются на суффикс "_I".
Такие же ракурсы есть на mkpf-mseg, rbkp-rseg, vbak-vbap, likp-lips, vbrk-vbrp.

_________________
С уважением,
Удав.
Back to top
View user's profile Send private message
Dmitriy
Аналитик
Аналитик


Age: 46
Joined: 14 Nov 2008
Posts: 300
Location: Russia

PostPosted: Thu Feb 05, 2009 6:45 pm    Post subject: Reply with quote

den wrote:
Потребность только в том, чтобы не перечислять все поля из ekpo. Муторно.


В Excel это делается очень быстро: в разных столбцах пишете то, что нужно (из словаря копи-пастом), а потом "СЦЕПИТЬ" - и в код.

_________________
ABAP/4 You
Back to top
View user's profile Send private message
den
Старший специалист
Старший специалист



Joined: 11 Oct 2007
Posts: 103

PostPosted: Mon Feb 09, 2009 1:19 pm    Post subject: Reply with quote

Извините за глупый вопрос, как в se11 скопировать в буфер обмена или в файл структуру таблицы (список всех полей). Получается скопировать только толя, видимые на экране. Sad


И еще возникает сомнение в правильности простого перечисления полей в select. Оно кажется опасным, так как со временем таблица может быть расширена через аппенд структуру.
Back to top
View user's profile Send private message
Удав
Гуру
Гуру


Age: 48
Joined: 25 Jan 2008
Posts: 580
Location: Москва

PostPosted: Mon Feb 09, 2009 1:47 pm    Post subject: Reply with quote

Это лучше делать через SE16 - ракурс DD03M.
_________________
С уважением,
Удав.
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 195
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Mon Feb 09, 2009 2:29 pm    Post subject: Reply with quote

den wrote:
И еще возникает сомнение в правильности простого перечисления полей в select. Оно кажется опасным, так как со временем таблица может быть расширена через аппенд структуру.


Используйте FOR ALL ENTRIES.
Будет медленнее, чем JOIN, зато надежно.

Code:
  DATA: BEGIN OF lt_ekko OCCURS 0,
          ebeln TYPE ekko-ebeln,
        END OF lt_ekko.
  DATA: gt_ekpo TYPE TABLE OF ekpo.

  SELECT ebeln
  INTO TABLE lt_ekko
  FROM ekko
  WHERE ebeln   IN so_ebeln
    AND bstyp   IN so_bstyp
    AND lifnr   IN so_lifpo

  IF NOT lt_ekko[] IS INITIAL.
    SELECT *
      INTO TABLE gt_ekpo
      FROM ekpo
      FOR ALL ENTRIES IN lt_ekko
      WHERE ebeln EQ lt_ekko-ebeln
        AND matkl   NE gs_ekpo_tpl-matkl.
  ENDIF.
Back to top
View user's profile Send private message Blog Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG.
SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG.
Every effort is made to ensure content integrity. Use information on this site at your own risk.