2012-11-16 47 views
3

我有一个查询似乎工作正常,但我想知道是否有更清洁(或更合适)的方式来写它。如何优化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)). 

感谢您的帮助。 迈克

回答

8

你可以尝试

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. 
+0

谢谢。这是一种简单(明显)的方式来获得我正在寻找的东西。我将使用SELECT SINGLE *切换SELECT foo bar baz,因为我想要所有字段,并且在ABAP中,single关键字只给出结果集中的第一条记录。 –

+1

对不起,你不能使用SELECT SINGLE和ORDER BY,你应该使用vwegert语法。 – franblay

+0

您是正确的franblay,SINGLE和ORDER BY不能一起使用。我将不得不寻找另一种方式。但是,这可以在其他地方使用,或者只是查看第一个返回的记录,所以我会接受这个答案。 –

1

不要使用SELECT *而不是使用Select(要求列表)

+0

是的,好点。这将提供一些小的优化,但我想知道如果我应该以不同的方式执行子'选择'。 –

+0

联结是获得你想要的更好的手段。 – CodeMonkey

+0

http://stackoverflow.com/questions/979927/how-can-i-join-a-table-to-itself-in-t-sql – CodeMonkey