76

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ですか?

4

15 に答える 15

118

これはあなたが得るエラーです(私のものを強調してください):

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

では、どうすればエラーを回避できますか? 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
于 2009-06-12T10:02:38.570 に答える
37

クエリで 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 の破壊的変更を参照してください

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

于 2010-03-13T04:49:14.920 に答える
33

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
于 2017-05-19T09:38:49.893 に答える
5

サブクエリで order by は必要ありません。それをメインクエリに移動し、並べ替えたい列をサブクエリに含めます。

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

于 2009-06-12T09:58:56.830 に答える
3

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

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で並べ替えられた内部サブクエリ(テーブルからの任意のサブクエリである可能性があります)

于 2010-11-18T07:05:40.747 に答える
3

サブクエリ (ネストされたビュー) は、呼び出し元のクエリで注文できるデータセットを返します。サブクエリ自体を並べ替えても、呼び出しクエリの結果の順序に (信頼できる) 違いはありません。

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

抱えている問題を解決するために、私たちに伝えたい情報が他にもたくさんあると思います。

于 2009-06-12T10:03:19.147 に答える
3

サブクエリに Top コマンドを追加します...

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

:)

于 2009-06-12T10:04:32.950 に答える
2

orderby句をsubselectの外に移動し、orderbyフィールドをsubselectに追加してみてください



SELECT * FROM 

(SELECT COUNT(1) ,refKlinik_id FROM Seanslar WHERE MONTH(tarihi) = 4 GROUP BY refKlinik_id)
as dorduncuay 

ORDER BY refKlinik_id 

于 2012-09-24T02:07:48.677 に答える
2

この例では、順序付けによって情報が追加されません。セットの COUNT は、順序に関係なく同じです。

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

于 2009-06-12T09:59:05.537 に答える
1

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

SELECT tbl.a, tbl.b
FROM (SELECT TOP (select count(1) FROM yourtable) a,b FROM yourtable order by a) tbl
于 2013-09-14T22:39:25.453 に答える