2017-02-23 108 views
0

Скажем, таблицы Employee and Shippers имеют следующие данные.Как получить данные в том же порядке, что и подзапрос?

EmployeeID Name  
1   Davolio 
2   Fuller 
3   Leverling 
4   Peacock 
5   Buchanan 
6   Suyama 
7   King  
8   Callahan 
9   Dodsworth 
10   West 

ShipperID ShipperName 
1   Speedy Express 
2   United Package 
3   Federal Shipping 

Следующий запрос возвращает ShipperID в порядке убывания.

select ShipperID from Shippers order by ShipperID desc; 

Теперь я хочу, чтобы получить имена из таблицы Employee в том же порядке, ShipperID являются извлеченной (3,2,1). Мой ожидаемый результат: Leverling, Fuller, Davolio.

select Name from Employee where EmployeeID in (select ShipperID from Shippers order by ShipperID desc) 

Вышеуказанный запрос не возвращает данные, как я ожидаю. Как это исправить?

ОБНОВЛЕНИЕ: Речь идет не о заказе записей в порядке возрастания или убывания. Это всего лишь пример, который я опубликовал здесь. Чтобы сделать это более понятным, предположим, что подзапрос возвращает ShipperID как 2,3,1. Теперь я хочу, чтобы получить записи из таблицы Employee, как Fuller, Leverling, Davolio

+0

Я удивлен, что запрос даже работает. Зачем вам «заказывать»? Вы только хотите увидеть, присутствует ли «EmployeeID», порядок не имеет значения. Если вы хотите, чтобы ваши результаты были заказаны, вы должны заказать свой внешний запрос. – HoneyBadger

ответ

0

Вы пробовали

select Name from Employee where EmployeeID in (select ShipperID from Shippers) order by ShipperID desc 
3

Вы должны соединить две таблицы, если вы хотите, чтобы сохранить порядок. Порядок в подзапрос не сохраняется, если вы используете IN

0
select Name from Employee where EmployeeID in (select ShipperID from Shippers) order by EmployeeID desc 

, как EmployeeID = shipperid вы можете заказать по EmployeeID

1

попробовать это

select distinct Employee.Name from Employee 
inner join Shippers on Shippers.ShipperID=Employee.EmployeeID 
order by Shippers.ShipperID desc 
+2

Только, что это будет ошибка из-за DISTINCT и ORDER BY, которые не синхронизированы, иначе это будет работать. –

0

Если вы хотите результаты появляются в частности, заказ, тогда вам нужно будет выбрать что-то по порядку. В вашем примере это означает добавление столбца для определения порядка отправителей, а затем присоединение к таблице сотрудников, чтобы вы могли затем соответствующим образом упорядочить результаты работы сотрудника.

Что-то вроде:

WITH employees AS (SELECT 1 employeeid, 'Davolio' NAME FROM dual UNION ALL 
        SELECT 2 employeeid, 'Fuller' NAME FROM dual UNION ALL 
        SELECT 3 employeeid, 'Leverling' NAME FROM dual UNION ALL 
        SELECT 4 employeeid, 'Peacock' NAME FROM dual UNION ALL 
        SELECT 5 employeeid, 'Buchanan' NAME FROM dual), 
     shippers AS (SELECT 1 shipperid, 'Speedy Express' shippername FROM dual UNION ALL 
        SELECT 2 shipperid, 'United Package' shippername FROM dual UNION ALL 
        SELECT 3 shipperid, 'Federal Shipping' shippername FROM dual) 
-- end of mimicking your tables, see SQL below: 
SELECT emp.employeeid, 
     emp.name 
FROM employees emp 
     INNER JOIN (SELECT shipperid, 
          CASE WHEN shipperid = 1 THEN 3 
           WHEN shipperid = 2 THEN 1 
           WHEN shipperid = 3 THEN 2 
          END order_id 
        FROM shippers) shp ON emp.employeeid = shp.shipperid 
ORDER BY shp.order_id ASC; 

EMPLOYEEID NAME 
---------- --------- 
     2 Fuller 
     3 Leverling 
     1 Davolio 

Ваша колонка order_id может быть что-то, что уже существует (например, столбец временной метки) или сгенерированы (либо явного сазе, как я показал выше, или с помощью row_number() аналитической функции), но если вы хотите, чтобы ваши результаты отображались в определенном порядке, вам нужна эта колонка.