Как оптимизировать запрос ABAP

У меня есть запрос, который, похоже, работает нормально, но мне интересно, есть ли более чистый (или более подходящий) способ его написать.

Цель состоит в том, чтобы найти запись в таблице ZVBAPIUSW01, где дата (UPDPASS) и время (UPDPASSTIME) являются наибольшими на основе данного идентификатора пользователя.

Вот что у меня получилось:

SELECT SINGLE * FROM ZVBAPIUSW01
  WHERE OBJID = ID
  AND UPDPASS IN (
    SELECT MAX( UPDPASS ) FROM ZVBAPIUSW01 WHERE OBJID = ID )
  AND UPDPASSTIME IN (
    SELECT MAX( UPDPASSTIME ) FROM ZVBAPIUSW01 WHERE OBJID = ID AND UPDPASS IN (
      SELECT MAX( UPDPASS ) FROM ZVBAPIUSW01 WHERE OBJID = ID ) ).

Спасибо за вашу помощь. Майк


person Michael Freake    schedule 16.11.2012    source источник


Ответы (2)


Вы могли бы попробовать

SELECT foo bar baz
  FROM ZVBAPIUSW01 UP TO 1 ROWS
  INTO (l_foo, l_bar, l_baz)
  WHERE OBJID = ID
  ORDER BY updpass DESCENDING updpasstime DESCENDING.
person vwegert    schedule 17.11.2012
comment
Спасибо. Это такой простой (и очевидный) способ получить то, что я ищу. Я переключу SELECT foo bar baz на SELECT SINGLE *, так как мне нужны все поля, а в ABAP одно ключевое слово дает мне только первую запись из набора результатов. - person Michael Freake; 18.11.2012
comment
Мне жаль, что вы не можете использовать SELECT SINGLE с ORDER BY, вы должны использовать синтаксис vwegert. - person franblay; 20.11.2012
comment
Вы правы, franblay, SINGLE и ORDER BY не могут использоваться вместе. Придется найти другой способ. Однако это будет работать в других местах или если я просто посмотрю на первую возвращенную запись, поэтому я приму этот ответ. - person Michael Freake; 22.11.2012
comment
UP TO 1 ROWS завершает этот ответ за меня. Очень признателен. - person Michael Freake; 23.11.2012

Не используйте Select * вместо этого используйте Select (обязательный список)

person CodeMonkey    schedule 16.11.2012
comment
Да, хорошее замечание. Это обеспечит небольшую оптимизацию, но мне интересно, следует ли выполнять подвыборки по-другому. - person Michael Freake; 17.11.2012
comment
Присоединение - лучший способ получить желаемое. - person CodeMonkey; 17.11.2012
comment
stackoverflow.com/questions/979927/ - person CodeMonkey; 17.11.2012
comment
Обратите внимание, что JOIN переопределяют кеш базы данных SAP. Однако есть обходной путь. Когда вы запрашиваете представление базы данных на основе вашего соединения, вы можете включить для него кеширование. - person Philipp; 19.11.2012