Есть ли такая вещь, как SELECT LAST в запросе SQL? - PullRequest
6 голосов
/ 02 октября 2008

Я использую базу данных sybase для запроса ежедневного отчета о транзакциях. У меня был подзапрос в моем сценарии.

Вот как это происходит:

SELECT orders.accountid ,items.x,etc
(SELECT charges.mistotal FROM charges where items.id = charges.id)
FROM items,orders
WHERE date = '2008-10-02'

Здесь я получаю сообщение об ошибке:

Подзапрос не может возвращать более одного значения

Мои значения 7,50, 25,00

Я хочу вернуть 25,00, но когда я использую

(SELECT TOP 1 charges.mistotal FROM charges where items.id = charges.id)

Мой результат 7,50, но я хочу вернуть 25,00

У кого-нибудь есть предложения получше?

Ответы [ 7 ]

9 голосов
/ 02 октября 2008
SELECT TOP 1 * 
FROM dbo.YourTable 
ORDER BY Col DESC

В вашем случае, я думаю, это будет

SELECT TOP 1 charges.mistotal 
FROM charges where items.id = charges.id 
ORDER BY charges.mistotal DESC
2 голосов
/ 02 октября 2008

По каким критериям вы выбираете 25,00 вместо 7,5?

Если оно связано с максимальным значением, вы можете попробовать использовать в этом поле функцию MAX () .

Если он связан с хронологически добавленной последней строкой, попробуйте использовать MAX () в поле даты и времени, если у вас есть сведения о часах и минутах, в которые оно было добавлено.

1 голос
/ 02 октября 2008

Для получения первого вы используете выберите топ 1 | сначала * из таблицы ордер по возрастанию чтобы получить последний, просто инвертируй свой ордер.

1 голос
/ 02 октября 2008

Итак, вы можете использовать обратный порядок:

(SELECT TOP 1 charges.mistotal
    FROM charges
    WHERE items.id = charges.id
    ORDER BY charges.mistotal DESC
)

На самом деле, поскольку вы не дали явный приказ, последовательность возвращаемых результатов не определена, и вам просто повезло, что она дала вам ответ, который вы не хотели; он мог дать вам ответ, который вы хотели, и тогда вы, возможно, не заметили бы, что он не всегда был корректным, пока не поступил в производство.

Или, вы можете использовать:

(SELECT MAX(charges.mistotal)
    FROM charges
    WHERE charges.id = items.id
)

Или ты действительно хотел СУММУ?

1 голос
/ 02 октября 2008

Вы можете попробовать это:

SELECT MAX(charges.mistotal) FROM charges WHERE items.id = charges.id
0 голосов
/ 02 октября 2008

Сортировка вашего подзапроса. Если вам нужно «последнее» значение, вам нужно определить, каким образом вы определяете, какой элемент следует последним (помните, наборы результатов SQL по умолчанию неупорядочены).

Например:

(SELECT TOP 1 charges.mistotal FROM charges where items.id = charges.id 
 ORDER BY charges.mistotal DESC)

Это вернуло бы 25,00 вместо 7,50 (из ваших примеров данных выше), но я предполагаю, что вы хотите, чтобы это значение было «последним», потому что оно больше. Там может быть какая-то другая область, по которой вам имеет смысл сортировать; может быть, у вас есть столбец отметки времени, например, и вы можете отсортировать его, чтобы получить самое последнее значение вместо наибольшего значения. Ключ просто определяет, что вы подразумеваете под «последним».

0 голосов
/ 02 октября 2008

ВЫБЕРИТЕ ТОП 1 charge.mistotal ОТ сборов, где items.id = charge.id ЗАКАЗАТЬ на charge.id DESC

Предложение order by будет гарантировать, что оно возвращается в порядке идентификатора, а DESC означает убывание, поэтому сначала вы получите самое большое (самое новое) значение. ТОП 1, конечно, гарантирует, что вы просто получите это.

...