2017-02-23 46 views
0

让我们说Employee和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; 

现在,我想要从雇员表名称在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 

为雇员= shipperid您可以通过雇员

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列可能是一些已经存在(如timestamp列)或生成(通过一个明确的情况下发言,因为我上面证明,或者通过使用row_number()解析函数),但如果您希望您的结果以特定顺序显示,则需要该列。

相关问题