web-dev-qa-db-ja.com

サブクエリの順序別のSQLエラー

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サブクエリで?

63
cagin

これはあなたが得るエラーです(強調鉱山):

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
100
Tomalak

クエリでは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の重大な変更 を参照してください

これがお役に立てば幸いです、パトリック

33
Patrick Wolf

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
18
Jez

サブクエリで順序を指定する必要はありません。それをメインクエリに移動し、サブクエリに並べ替える列を含めます。

ただし、クエリはカウントを返すだけなので、順序のポイントはわかりません。

4
cjk

サブコマンドにトップコマンドを追加...

SELECT 
(
SELECT TOP 100 PERCENT 
    COUNT(1) 
FROM 
    Seanslar 
WHERE 
    MONTH(tarihi) = 4
GROUP BY 
    refKlinik_id
ORDER BY 
    refKlinik_id
) as dorduncuay

:)

3
user110714

多分このトリックは誰かを助けるでしょう

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で順序付けされた内部サブクエリ(テーブルの任意のサブクエリ)

3
Vlad

この例では、順序付けは情報を追加しません。セットのCOUNTは、順序に関係なく同じです。

did順序に依存するものを選択する場合は、エラーメッセージに示されているいずれかの操作を行う必要があります-TOPまたはFOR XMLを使用します

2
AakashM

持っているサブクエリ(ネストされたビュー)は、呼び出し元のクエリで順序付けできるデータセットを返します。サブクエリ自体の順序付けは、呼び出し元クエリの結果の順序に(信頼できる)違いをもたらしません。

SQL自体について:a)単一の値を返すため、注文の理由はありません。 b)単一の値のみを返すため、サブクエリの理由はありません。

あなたが抱えている問題を解決するためにあなたが私たちに伝えたいと思うかもしれないより多くの情報がここにあると推測しています。

2
Robin Day

私にとって、この解決策もうまくいきます:

SELECT tbl.a, tbl.b
FROM (SELECT TOP (select count(1) FROM yourtable) a,b FROM yourtable order by a) tbl
1
Qohelet

一時テーブルを作成する場合は、ORDER BY句を一時テーブルコードブ​​ロックの内部から外部に移動します。

許可されない:

SELECT * FROM (
SELECT A FROM Y
ORDER BY Y.A
) X;

許可:

SELECT * FROM (
SELECT A FROM Y
) X
ORDER BY X.A;
1
MacGyver

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 

1
indrap

良い一日

一部の人にとっては、サブクエリの順序が疑わしいです。いくつかの並べ替えに基づいていくつかのレコードを削除する必要がある場合は、サブクエリの順序を使用する必要があります。好む

delete from someTable Where ID in (select top(1) from sometable where condition order by insertionstamp desc)

最後の挿入フォームテーブルを削除できます。この削除を実際に行うには3つの方法があります。

ただし、多くの場合、サブクエリの順序は使用できます。

リンクの下のサブクエリレビューで順序を使用する削除方法

http://web.archive.org/web/20100212155407/http://blogs.msdn.com/sqlcat/archive/2009/05/21/fast-ordered-delete.aspx

役に立てば幸いです。みんなありがとう

1
Omar Kamel

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

偽のオフセットサブクエリの結果よりも明確だと思います。

0
iguypouf

このコードを使用して上位2番目の給与を取得する

私もエラーを取得しています

ORDER BY句は、TOPまたはFOR XMLも指定されていない限り、ビュー、インライン関数、派生テーブル、サブクエリ、および共通テーブル式では無効です。

エラーを回避するために使用したトップ100

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

0
soundar rajan

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。

0
iLWR