У вас есть несколько вариантов
SELECT DOC_NAME
FROM DOCUMENTS
WHERE DELIVERY_TIMESTAMP IN (
SELECT MAX(DELIVERY_TIMESTAMP)
FROM DOCUMENTS
)
Или с соединениями
SELECT DOC_NAME
FROM DOCUMENTS
INNER JOIN (
SELECT MAX(DELIVERY_TIMESTAMP) AS MAX_DELIVERY_TIMESTAMP
FROM DOCUMENTS
) AS M
ON M.MAX_DELIVERY_TIMESTAMP = DOCUMENTS.DELIVERY_TIMESTAMP
Это становится более сложным, если есть дубликаты в метку времени или вам нужно несколько столбцов в вашем «Макс» (поскольку MAX()
находится только над одной колонкой для всех строк)
Это где опция JOIN
является единственным доступным вариантом, так как конструкция, как это не доступно (скажем, несколько заказов с одинаковой меткой времени):
SELECT DOC_NAME
FROM DOCUMENTS
WHERE (DELIVERY_TIMESTAMP, ORDERID) IN (
SELECT TOP 1 DELIVERY_TIMESTAMP, ORDERID
FROM DOCUMENTS
ORDER BY DELIVERY_TIMESTAMP DESC, ORDERID DESC
)
Где вы на самом деле, нужно будет сделать:
SELECT DOC_NAME
FROM DOCUMENTS
INNER JOIN (
SELECT TOP 1 DELIVERY_TIMESTAMP, ORDERID
FROM DOCUMENTS
ORDER BY DELIVERY_TIMESTAMP DESC, ORDERID DESC
) AS M
ON M.DELIVERY_TIMESTAMP = DOCUMENTS.DELIVERY_TIMESTAMP
AND M.ORDERID = DOCUMENTS.ORDERID
Cade, я собирался ответить с помощью решения JOIN, а затем я проверил план выполнения для каждой техники. Sql Server 2005 (db, который мне удобен) использует один и тот же план выполнения для каждого синтаксиса. Итак, у вас есть выбор ... и производительность не пострадает – 2008-10-31 15:58:53