2015-06-03 3 views
2

У меня есть дополнительный запрос, который возвращает более одного значения. Пожалуйста, смотрите запрос ниже. Существует вероятность того, что для данного клиента и даты существует более одного порядка. В этом случае я хочу только вернуть один заказ (это может показаться странным, но это то, что я хочу выполнить). Как установить этот предел? Я попытался установить ограничение 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 
+0

(SELECT MAX (order) FROM ...? – jarlh

+0

Так оно и было. Я не думал, что в этом контексте можно использовать max. Если вы сделаете так, –

+0

Теперь также в качестве ответа. – jarlh

ответ

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 

Обратите внимание, что оба ORDER и DATE зарезервированы слова в ANSI SQL. Я предлагаю вам двойную цитату, чтобы избежать будущих проблем и улучшить переносимость.

+0

'ORDER' и' DATE' также являются зарезервированными ключевыми словами в Teradata, поэтому, надеюсь, это был всего лишь пример, а не фактические имена столбцов/таблиц :-) – dnoeth

+0

Это правда. :-) Так как у моего исходного кода были ужасные имена, я хотел их изменить, чтобы сделать его проще. Я об этом не думал. Извините за причинение этой путаницы. –

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 
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 
3

Используйте ROW_NUMBER, чтобы найти последний заказ за имя, а затем присоединиться к нему (например "ORDER".):

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 

Btw, это будет работать гораздо лучше, чем вложенные MAX. И это проще написать :-)

Смежные вопросы