Posted: Wed Feb 04, 2009 4:42 pm Post subject: SELECT * и JOIN
Здравствуйте, допустим ли такой запрос со звездочкой в 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 содержится в обоих таблицах и оно всегда одинаково.
Age: 37 Joined: 18 Jan 2008 Posts: 71 Location: Tashkent-Astana-Moscow
Posted: Wed Feb 04, 2009 4:57 pm Post subject:
по поему в поля внутренней таблицы сядут значения из таблиц нижних жойнов(хотя сам не пробовал ). но такая практика не приведет ни к чему хорошему. очень не предсказуемо
кстати интересно откуда такая потребность появилась ?
Joined: 21 Nov 2008 Posts: 25 Location: СПб - Валлдорф
Posted: Thu Feb 05, 2009 12:08 pm Post subject:
Классический стандарт ANSI SQL92 позволяет иметь * под селектом. Не могу отвечать за все, но большинство SQL серверов принимает данную форму. В этом случае будут выданы сначала поля из первой таблицы, потом из второй. Серверу собственно все равно как этот результат будет потом интерпретирован вызывающей стороной. MSSQL, кажется, переименовывает столбец (но я тут не уверен - давно это было ). Поблема возникает только в случае если явно указано поле присутствующее в обеих таблицах, но при этом не указано откуда именно его брать.
Что же касается результата, то как правило возвращается последнее совпадающее по имени поле из запроса.
Age: 37 Joined: 18 Jan 2008 Posts: 71 Location: Tashkent-Astana-Moscow
Posted: Thu Feb 05, 2009 1:25 pm Post subject:
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.
Age: 48 Joined: 25 Jan 2008 Posts: 580 Location: Москва
Posted: Thu Feb 05, 2009 5:53 pm Post subject: Re: SELECT * и JOIN
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. _________________ С уважением,
Удав.
Age: 47 Joined: 14 Nov 2008 Posts: 300 Location: Russia
Posted: Thu Feb 05, 2009 6:45 pm Post subject:
den wrote:
Потребность только в том, чтобы не перечислять все поля из ekpo. Муторно.
В Excel это делается очень быстро: в разных столбцах пишете то, что нужно (из словаря копи-пастом), а потом "СЦЕПИТЬ" - и в код. _________________ ABAP/4 You
Извините за глупый вопрос, как в se11 скопировать в буфер обмена или в файл структуру таблицы (список всех полей). Получается скопировать только толя, видимые на экране.
И еще возникает сомнение в правильности простого перечисления полей в select. Оно кажется опасным, так как со временем таблица может быть расширена через аппенд структуру.
Age: 170 Joined: 04 Oct 2007 Posts: 1218 Location: Санкт-Петербург
Posted: Mon Feb 09, 2009 2:29 pm Post subject:
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.
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.