SQL子查询获取第一条记录

时间:2014-03-24 14:23:26

标签: sql database oracle

我需要执行类似下面的查询。

SELECT TO_CHAR(ROWNUM),
A.Name,
B.Order,
(SELECT * FROM (
SELECT ROUND(LAST_ORDER_AMOUNT,5) FROM ORDERS WHERE ID=A.id AND REQUEST_LEVEL='N' ORDER BY O_DATE DESC)
WHERE ROWNUM =1) AS AMOUNT
FROM Table1 A LEFT JOIN Table2 B
ON A.TYPE_CODE = B.ENTITY_TYPE

但是这给了我A.id在oracle中是无效的错误。我需要从内部查询中获取第一条记录,因为它将返回多条记录。

有人可以告诉我如何绑定这些表来实现我的目标。

提前谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用WITH子句重写子查询,不完全确定语法,但应该像下面这样。

WITH    AmountQuery
      AS (
           SELECT ID
               ,ROUND(LAST_ORDER_AMOUNT, 5) AS AmountValue
               ,ROW_NUMBER() OVER ( ORDER BY O_DATE DESC ) AS RN
            FROM ORDERS
            WHERE REQUEST_LEVEL = 'N'
         )
SELECT TO_CHAR(ROWNUM)
       ,A.Name
       ,B.Order
       ,C.AmountValue
    FROM Table1 A
    LEFT JOIN Table2 B
        ON A.TYPE_CODE = B.ENTITY_TYPE
    LEFT JOIN AmountQuery C
        ON a.ID = c.ID
           AND c.RN = 1

这里是SQLFiddle来展示它是如何工作的。

http://sqlfiddle.com/#!4/696b6/36

答案 1 :(得分:0)

可能LIMIT会为你从子查询中选择一条记录(它在MySQL中为我工作。我没有Oracle,但我认为它可能类似)。尝试这样的事情:

SELECT TO_CHAR(ROWNUM),
A.Name,
B.Order,
COALESCE( C.AMOUNT ) as AMOUNT,
FROM Table1 A LEFT JOIN Table2 B
ON A.TYPE_CODE = B.ENTITY_TYPE
LEFT JOIN ( SELECT ROUND(LAST_ORDER_AMOUNT,5) AS AMOUNT FROM ORDERS WHERE REQUEST_LEVEL='N' ORDER BY  O_DATE DESC ) C ON C.ID = A.id
group by A.id;