子查询返回的多个值

时间:2015-06-03 10:20:38

标签: sql teradata

我有一个返回多个值的子查询。请参阅下面的查询。对于给定的客户和日期,可能存在多个订单。在那种情况下,我只想返回一个订单(这可能听起来很奇怪,但这就是我想要完成的)。如何设置该限制?我试图在子查询中设置限制1,但我没有设法让它工作?

有什么想法吗?

我正在使用Teradata

SELECT Person.name, 
(SELECT order FROM ORDER where
ORDER.name=Person.name AND
ORDER.date=(SELECT MAX(date) FROM ORDER WHERE ORDER.name=Person.name))order
FROM Person 

4 个答案:

答案 0 :(得分:3)

使用ROW_NUMBER查找每个名称的最新订单,然后加入:

SELECT
   Person.name, 
   ORDER.order
FROM Person AS p 
LEFT JOIN 
 (
   SELECT * 
   FROM ORDER
   QUALIFY ROW_NUMBER() OVER (PARTITION BY name ORDER BY date DESC) = 1
 ) as o
ON ORDER.name=Person.name

顺便说一下,这比嵌套的MAX要好得多。而且写起来更容易: - )

答案 1 :(得分:1)

您可以使用子查询中的Top 1 MAX(日期),类似这样

SELECT Person.name, 
(SELECT order FROM ORDER where
ORDER.name=Person.name AND
ORDER.date=(SELECT TOP 1 MAX(date) FROM ORDER WHERE ORDER.name=Person.name))order
FROM Person

答案 2 :(得分:1)

正如我的评论一样,答案如下:

SELECT Person.name, 
       (SELECT MAX(order) FROM ORDER
        where ORDER.name = Person.name
          AND ORDER.date = (SELECT MAX(date) FROM ORDER
                            WHERE ORDER.name = Person.name)) order
FROM Person

请注意,ORDERDATE都是ANSI SQL中的保留字。我建议你加倍引用它们以避免将来出现问题并提高可移植性。 (例如"ORDER"。)

答案 3 :(得分:0)

SELECT p.name, (SELECT MAX(o.order)
                FROM ORDER o 
                WHERE o.name = p.name 
                AND o.date= (SELECT MAX(o.date) 
                             FROM ORDER o
                             WHERE o.name = p.name))
FROM Person p