Sql 子查询返回多个值

Sql 子查询返回多个值,sql,teradata,Sql,Teradata,我有一个返回多个值的子查询。请参见下面的查询。对于给定的客户和日期,可能存在多个订单。在这种情况下,我只想返回一个订单(听起来可能很奇怪,但这正是我想要完成的)。我如何设置该限制?我试图在子查询中设置限制1,但没有成功 有什么想法吗 我正在使用Teradata SELECT Person.name, (SELECT order FROM ORDER where ORDER.name=Person.name AND ORDER.date=(SELECT MAX(date) FROM ORDER

我有一个返回多个值的子查询。请参见下面的查询。对于给定的客户和日期,可能存在多个订单。在这种情况下,我只想返回一个订单(听起来可能很奇怪,但这正是我想要完成的)。我如何设置该限制?我试图在子查询中设置限制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 
您可以使用子查询中的前1个最大值(日期),如下所示

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

在我的评论中,答案如下:

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

请注意,
ORDER
DATE
都是ANSI SQL中的保留字。我建议您对它们进行双重引用,以避免将来出现问题并提高可移植性。(例如
“订单”

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

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
性能好得多。写起来更容易:-)

(从…?中选择MAX(order)就是这样。我没想到MAX可以用在这个上下文中。如果你这样回答,我会接受的。
order
DATE
也是Teradata中的保留关键字,所以希望它只是一个示例,而不是实际的列/表名:-)这是真的。:-)因为我的原始代码有可怕的名字,我想改变它们,使之更容易。我没有想到这一点。很抱歉造成这种混乱。
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