子查询返回多个值
More than one value returned by subquery
我有一个 return 不止一个 value.Please 的子查询,请参阅下面的查询。对于给定的客户和日期,可能存在多个订单。在那种情况下,我只想 return 一个订单(这听起来可能很奇怪,但这就是我想要完成的)。我如何设置该限制?我试图在子查询中设置 limit 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
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
您可以使用子查询中的 Top 1 MAX(date),像这样
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 中的保留字。我建议您将它们双引号以避免将来出现问题并提高可移植性。 (例如 "ORDER"
。)
使用 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
的性能要好得多。而且写起来更容易:-)
我有一个 return 不止一个 value.Please 的子查询,请参阅下面的查询。对于给定的客户和日期,可能存在多个订单。在那种情况下,我只想 return 一个订单(这听起来可能很奇怪,但这就是我想要完成的)。我如何设置该限制?我试图在子查询中设置 limit 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
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
您可以使用子查询中的 Top 1 MAX(date),像这样
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 中的保留字。我建议您将它们双引号以避免将来出现问题并提高可移植性。 (例如 "ORDER"
。)
使用 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
的性能要好得多。而且写起来更容易:-)