SQL-подзапрос Oracle: используя минимум, но получая все столбцы
MIN(A.price) CustomerID TripID travelby
25 x05 66 train
66 x07 21 train
100 x07 12 train
Пытаюсь выяснить это. Приведенные выше результаты получены из запроса 2 таблиц. Однако мне нужно изменить его так, чтобы он давал мне результат минимальной цены со всеми 4 столбцами.
это был мой оригинальный sql:
(выберите min(цена) из поездок a, клиенты b, где a.tripid = b.tripid и c.travelmode = 'train')
Я могу получить только строку с 25, но это только если я запрашиваю столбец цены. Как бы вы пошли по этому поводу, но получить все столбцы? Спасибо за весь вклад
2 ответа
Решение
SELECT *
FROM (
SELECT *
FROM trips a
INNER JOIN customers b
ON ( a.tripid = b.tripid )
WHERE travelby = 'train'
ORDER BY price ASC
)
WHERE ROWNUM = 1;
или же
SELECT *
FROM (
SELECT price,
CustomerID,
a.TripID,
travelby,
ROW_NUMBER() OVER ( ORDER BY price ASC ) AS rn
FROM trips a
INNER JOIN customers b
ON ( a.tripid = b.tripid )
WHERE travelby = 'train'
ORDER BY price ASC
)
WHERE rn = 1;
Или же:
SELECT MIN( price ) AS price,
MIN( CustomerID ) KEEP ( DENSE_RANK FIRST ORDER BY price, ROWNUM ) AS CustomerID,
MIN( a.TripID ) KEEP ( DENSE_RANK FIRST ORDER BY price, ROWNUM ) AS TripID,
MIN( travelby ) KEEP ( DENSE_RANK FIRST ORDER BY price, ROWNUM ) AS travelby
FROM trips a
INNER JOIN customers b
ON ( a.tripid = b.tripid )
WHERE travelby = 'train'
Вы можете сделать что-то вроде этого:
select . . .
from (select . . ., row_number() over (order by price desc) as seqnum
from trips t join
customers c
on c.tripid = t.tripid and ?.travelmode = 'train'
)
where seqnum = 1;
Ваша версия запроса довольно запутанная:
- Почему это в скобках?
- Что такое
c.travelmode
? Вы не определили псевдоним таблицыc
, - Научитесь использовать правильное, явное
JOIN
синтаксис.