【问题标题】:Can we use order by in subquery? If not why sometime could use top(n) order by?我们可以在子查询中使用 order by 吗?如果不是,为什么有时可以使用 top(n) order by?
【发布时间】:2017-04-26 17:51:38
【问题描述】:

我是入门级,想了解更多关于 SQL 的知识,

我有一个问题“我们可以在子查询中使用 order by 吗?”我确实找了一些文章说不,我们不能使用。

但另一方面,我在子查询中看到了使用 top(n) 和 order by 的示例:

select c.CustomerId,
    c.OrderId
from CustomerOrder c
inner join (
    select top 2
    with TIES CustomerId,
        COUNT(distinct OrderId) as Count
    from CustomerOrder
    group by CustomerId
    order by Count desc
    ) b on c.CustomerId = b.CustomerId

所以现在我有点困惑。

谁能给点建议?

非常感谢。

【问题讨论】:

标签: sql subquery sql-order-by


【解决方案1】:
  1. 是的,你是对的,我们不能在内部查询中使用 order by。因为它充当了一张桌子。当出于不同目的进行查询时,需要对表本身进行排序。

  2. 在您的查询本身中,内部查询是使用 Top 2 选择一些记录。尽管这些只是前 2 条记录,但它们形成了一个包含 2 条记录的表,足以将其识别为一个表并将其与另一张桌子

正确的查询是:-

SELECT * FROM
(
    SELECT c.CustomerId, c.OrderId, DENSE_RANK() OVER(ORDER BY b.count DESC) AS RANK

    FROM CustomerOrder c

    INNER JOIN

    (SELECT CustomerId, COUNT(distinct OrderId) as Count
    FROM CustomerOrder   GROUP BY CustomerId) b 

    ON c.CustomerId = b.CustomerId
) a

WHERE RANK IN (1,2);

希望我已经回答了你的问题。

【讨论】:

  • 嗨,Inian.Rocket,谢谢你的回复,顺便说一句,喜欢你的名字。如果最终输出应该只有 customerId 和 OrdeId 而没有计数,我该怎么办?
  • @ADJ 只需从选择中删除计数,您仍然会得到答案。为了你的理解,我把它放在那里。只是为了确保您可以验证和理解结果也发布获取输出
  • 对不起,如果我很好地解释了我的问题。我想列出最大订单的前 2 个 customerId,你的代码运行得很好,但它没有返回我想要的
  • @ADJ 你得到了什么,因为逻辑是正确的。它应该给你正确的结果。使用和不使用 TOP 2 TIES 语句检查此查询。如果前 2 条记录相同,那么您的结果是正确的
  • 是的,如果我们正在寻找前 2 个组合(customerid 和 orderid)作为键,逻辑是正确的。例如,我们有客户 1,2,3,订单号 a,b,c。客户 1 有订单 a,b,c,客户 2 有 a,c,客户 3 有 b。我最想找到顶级客户订单,所以客户 1 用 a,b,c 和客户 2 用 a,c。
【解决方案2】:

是的,我们可以在子查询中使用 order by 子句,例如我有一个名为 product 的表(查看表 http://prntscr.com/f15j3z 的屏幕截图)。在您身边检查此查询,如有任何疑问,请回复我。

select p1.* from product as p1 where product_id = (select p2.product_id from product as p2 order by product_id limit 0,1) 

【讨论】:

    【解决方案3】:

    是的,我们可以在子查询中使用 order by,但使用它是没有意义的。 最好在外层查询中使用。子查询的结果排序是没有用的,因为内层查询的结果会成为外层查询的输入,与结果的顺序无关子查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-25
      • 2015-02-01
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      相关资源
      最近更新 更多