我正在使用SQL Server 2005。
我的查询是:
SELECT (
SELECT COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
GROUP BY refKlinik_id
ORDER BY refKlinik_id
) as dorduncuay
错误:
除非还指定了TOP或FOR XML,否则ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效。
如何ORDER BY
在子查询中使用?
Answers:
这是您得到的错误(强调我的意思):
除非还指定了TOP或FOR XML,否则ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效。
那么,如何避免该错误呢?我想,通过指定TOP,将是一种可能性。
SELECT (
SELECT TOP 100 PERCENT
COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
GROUP BY refKlinik_id
ORDER BY refKlinik_id
) as dorduncuay
TOP 100 PERCENT
。但是,感谢您的提示,我不知道这一点。
除了order by在您的查询中似乎没有意义的事实之外。要在子选择中使用order by,您将需要使用TOP 2147483647。
SELECT (
SELECT TOP 2147483647
COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
GROUP BY refKlinik_id
ORDER BY refKlinik_id
) as dorduncuay
我的理解是,从SQL 2005开始,“ TOP 100 PERCENT”不再保证订购:
在SQL Server 2005中,视图定义中的ORDER BY子句仅用于确定TOP子句返回的行。查询视图时,ORDER BY子句不保证结果有序,除非在查询本身中也指定了ORDER BY。
希望这会有所帮助,帕特里克
如果您使用的是SQL Server 2012或更高版本,现在可以轻松解决。添加一个offset 0 rows
:
SELECT (
SELECT
COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
GROUP BY refKlinik_id
ORDER BY refKlinik_id OFFSET 0 ROWS
) as dorduncuay
将Top命令添加到您的子查询中...
SELECT
(
SELECT TOP 100 PERCENT
COUNT(1)
FROM
Seanslar
WHERE
MONTH(tarihi) = 4
GROUP BY
refKlinik_id
ORDER BY
refKlinik_id
) as dorduncuay
:)
也许这个技巧将帮助某人
SELECT
[id],
[code],
[created_at]
FROM
( SELECT
[id],
[code],
[created_at],
(ROW_NUMBER() OVER (
ORDER BY
created_at DESC)) AS Row
FROM
[Code_tbl]
WHERE
[created_at] BETWEEN '2009-11-17 00:00:01' AND '2010-11-17 23:59:59'
) Rows
WHERE
Row BETWEEN 10 AND 20;
这里是由字段created_at排序的内部子查询(可以是表中的任何子查询)
美好的一天
对于某些人来说,子查询中的顺序是有问题的。如果您需要基于某种排序删除某些记录,则必须使用子查询中的排序。喜欢
delete from someTable Where ID in (select top(1) from sometable where condition order by insertionstamp desc)
这样就可以删除最后一个插入表单表。实际有三种删除方法。
但是,在许多情况下都可以使用子查询中的排序。
有关在下面的子查询中使用order by的删除方法的链接
我希望这会有所帮助。谢谢大家
对于像OP所示的简单计数,严格不需要Order by。如果他们使用子查询的结果,则可能是。我正在处理类似的问题,并且在以下查询中遇到了相同的错误:
-我希望费用表中的行的updatedate等于最大updatedate:
SELECT * FROM #Costs Cost
INNER JOIN
(
SELECT Entityname, costtype, MAX(updatedtime) MaxUpdatedTime
FROM #HoldCosts cost
GROUP BY Entityname, costtype
ORDER BY Entityname, costtype -- *** This causes an error***
) CostsMax
ON Costs.Entityname = CostsMax.entityname
AND Costs.Costtype = CostsMax.Costtype
AND Costs.UpdatedTime = CostsMax.MaxUpdatedtime
ORDER BY Costs.Entityname, Costs.costtype
-***为此,有几种选择:
-添加一个无关的TOP子句,这似乎有点hack:
SELECT * FROM #Costs Cost
INNER JOIN
(
SELECT TOP 99.999999 PERCENT Entityname, costtype, MAX(updatedtime) MaxUpdatedTime
FROM #HoldCosts cost
GROUP BY Entityname, costtype
ORDER BY Entityname, costtype
) CostsMax
ON Costs.Entityname = CostsMax.entityname
AND Costs.Costtype = CostsMax.Costtype
AND Costs.UpdatedTime = CostsMax.MaxUpdatedtime
ORDER BY Costs.Entityname, Costs.costtype
-****创建一个临时表以订购maxCost
SELECT Entityname, costtype, MAX(updatedtime) MaxUpdatedTime
INTO #MaxCost
FROM #HoldCosts cost
GROUP BY Entityname, costtype
ORDER BY Entityname, costtype
SELECT * FROM #Costs Cost
INNER JOIN #MaxCost CostsMax
ON Costs.Entityname = CostsMax.entityname
AND Costs.Costtype = CostsMax.Costtype
AND Costs.UpdatedTime = CostsMax.MaxUpdatedtime
ORDER BY Costs.Entityname, costs.costtype
其他可能的解决方法可能是CTE或表变量。但是每种情况都需要您确定最适合您的方法。我倾向于首先看一下临时表。对我来说,这是明确而直接的。YMMV。
当您有UNION时,可能需要订购子查询:
您会生成所有教师和学生的电话簿。
SELECT name, phone FROM teachers
UNION
SELECT name, phone FROM students
您要先显示所有教师,然后再显示所有学生,均按顺序显示。因此,您不能通过应用全局订单。
一种解决方案是包括一个键,以强制进行第一个排序,然后对名称进行排序:
SELECT name, phone, 1 AS orderkey FROM teachers
UNION
SELECT name, phone, 2 AS orderkey FROM students
ORDER BY orderkey, name
我认为它的方法比伪造的偏移子查询结果更清晰。