我是尝试了解有关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
所以现在我有点困惑。
有人可以提出建议吗?
非常感谢。
答案 0 :(得分:0)
是的,我们可以在子查询中使用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)
答案 1 :(得分:0)
是的,你说得对,我们不能在内部查询中使用order by。因为它充当了一张桌子。当查询用于不同目的时,表本身需要进行排序。
在您的查询本身中,内部查询是使用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);
希望我已经回答了你的问题。
答案 2 :(得分:0)
是的,我们可以在子查询中使用order by,但使用它是没有意义的。 最好在外部查询中使用它。没有使用对子查询的结果进行排序,因为内部查询的结果将成为外部查询的输入,并且它不必对结果的顺序做任何事情。子查询。