【问题标题】:How to retrieve data in the same order as the subquery?如何以与子查询相同的顺序检索数据?
【发布时间】:2017-02-23 18:45:24
【问题描述】:

假设 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 检索相同的顺序从 Employee 表中检索 Names (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

【问题讨论】:

  • 我很惊讶查询甚至运行。为什么需要订购in?您只想查看EmployeeID 是否存在,顺序无关紧要。如果您希望对结果进行排序,则应订购外部查询

标签: sql oracle


【解决方案1】:

如果您想保持排序,则必须加入这两个表。如果使用IN,则不会保留子查询中的顺序

【讨论】:

    【解决方案2】:

    试试这个

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

    【讨论】:

    • 只是因为 DISTINCT 和 ORDER BY 不同步而导致错误,否则这将起作用。
    【解决方案3】:

    你试过了吗

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

    【讨论】:

      【解决方案4】:
      select Name from Employee where EmployeeID in (select ShipperID from Shippers ) order by EmployeeID desc
      

      作为employeeid=shipperid,您可以按employeeid 订购

      【讨论】:

        【解决方案5】:

        如果您希望结果以特定顺序显示,那么您将不得不选择要订购的东西。在您的示例中,这意味着添加一列来定义托运人的顺序,然后将其连接回员工表,以便您可以相应地对员工结果进行排序。

        类似:

        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 列可能已经存在(例如时间戳列)或生成的(通过我上面演示的显式 case 语句,或使用 row_number() 分析函数),但如果您希望显示结果按特定顺序,您需要该列。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-03
          • 1970-01-01
          • 1970-01-01
          • 2014-11-20
          • 2011-06-04
          相关资源
          最近更新 更多