SQL Server 2005を使用しています。
私のクエリは次のとおりです。
SELECT (
SELECT COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
GROUP BY refKlinik_id
ORDER BY refKlinik_id
) as dorduncuay
そしてエラー:
ORDER BY句は、TOPまたはFOR XMLも指定されていない限り、ビュー、インライン関数、派生テーブル、サブクエリ、および共通テーブル式では無効です。
どうすれば_ORDER BY
サブクエリで?
これはあなたが得るエラーです(強調鉱山):
ORDER BY句は、ビュー、インライン関数、派生テーブル、サブクエリ、および共通テーブル式では無効です。 tOPまたはFOR XMLも指定されていない限り。
だから、どのようにエラーを回避できますか? TOPを指定することで、1つの可能性があると思います。
SELECT (
SELECT TOP 100 PERCENT
COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
GROUP BY refKlinik_id
ORDER BY refKlinik_id
) as dorduncuay
クエリではorder byが意味をなさないという事実に加えて... sub selectで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
私の理解では、「TOP 100 PERCENT」はSQL 2005以降では順序付けを保証しません。
SQL Server 2005では、ビュー定義のORDER BY句は、TOP句によって返される行を決定するためにのみ使用されます。 ORDER BY句は、クエリ自体にORDER BYも指定されていない限り、ビューがクエリされたときに順序付けられた結果を保証しません。
SQL Server 2005の重大な変更 を参照してください
これがお役に立てば幸いです、パトリック
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
サブクエリで順序を指定する必要はありません。それをメインクエリに移動し、サブクエリに並べ替える列を含めます。
ただし、クエリはカウントを返すだけなので、順序のポイントはわかりません。
サブコマンドにトップコマンドを追加...
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で順序付けされた内部サブクエリ(テーブルの任意のサブクエリ)
この例では、順序付けは情報を追加しません。セットのCOUNTは、順序に関係なく同じです。
did順序に依存するものを選択する場合は、エラーメッセージに示されているいずれかの操作を行う必要があります-TOPまたはFOR XMLを使用します
持っているサブクエリ(ネストされたビュー)は、呼び出し元のクエリで順序付けできるデータセットを返します。サブクエリ自体の順序付けは、呼び出し元クエリの結果の順序に(信頼できる)違いをもたらしません。
SQL自体について:a)単一の値を返すため、注文の理由はありません。 b)単一の値のみを返すため、サブクエリの理由はありません。
あなたが抱えている問題を解決するためにあなたが私たちに伝えたいと思うかもしれないより多くの情報がここにあると推測しています。
私にとって、この解決策もうまくいきます:
SELECT tbl.a, tbl.b
FROM (SELECT TOP (select count(1) FROM yourtable) a,b FROM yourtable order by a) tbl
一時テーブルを作成する場合は、ORDER BY句を一時テーブルコードブロックの内部から外部に移動します。
許可されない:
SELECT * FROM (
SELECT A FROM Y
ORDER BY Y.A
) X;
許可:
SELECT * FROM (
SELECT A FROM Y
) X
ORDER BY X.A;
Sub selectの外でorder by句を移動して、sub selectのorder byフィールドを追加してみてください
SELECT * FROM
(SELECT COUNT(1) ,refKlinik_id FROM Seanslar WHERE MONTH(tarihi) = 4 GROUP BY refKlinik_id)
as dorduncuay
ORDER BY refKlinik_id
良い一日
一部の人にとっては、サブクエリの順序が疑わしいです。いくつかの並べ替えに基づいていくつかのレコードを削除する必要がある場合は、サブクエリの順序を使用する必要があります。好む
delete from someTable Where ID in (select top(1) from sometable where condition order by insertionstamp desc)
最後の挿入フォームテーブルを削除できます。この削除を実際に行うには3つの方法があります。
ただし、多くの場合、サブクエリの順序は使用できます。
リンクの下のサブクエリレビューで順序を使用する削除方法
役に立てば幸いです。みんなありがとう
UNIONがある場合、サブクエリを注文する必要があります。
すべての教師と生徒の電話帳を生成します。
SELECT name, phone FROM teachers
UNION
SELECT name, phone FROM students
最初にすべての教師に表示し、次にすべての生徒に順番に表示します。したがって、グローバル注文を適用することはできません。
1つの解決策は、最初の順序を強制するキーを含めてから、名前を順序付けることです。
SELECT name, phone, 1 AS orderkey FROM teachers
UNION
SELECT name, phone, 2 AS orderkey FROM students
ORDER BY orderkey, name
偽のオフセットサブクエリの結果よりも明確だと思います。
ORDER BY句は、TOPまたはFOR XMLも指定されていない限り、ビュー、インライン関数、派生テーブル、サブクエリ、および共通テーブル式では無効です。
select * from(select tbl.Coloumn1、CONVERT(varchar、ROW_NUMBER()OVER(ORDER BY(SELECT 1))))AS Rowno from(select top 1 * Table1 order from Coloumn1 desc)as tbl )tblとして、tbl.Rowno = 2
OPが示すような単純なカウントでは、Order byは厳密には必要ありません。副照会の結果を使用している場合は、そうである可能性があります。同様の問題に取り組んでいますが、次のクエリでも同じエラーが発生しました。
-更新日が最大の更新日と等しいコストテーブルの行が必要です。
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句を追加します。これはちょっとしたハックのようです。
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。