1

次のSQLがあり、Incorrect syntax near keyword 'ORDER'実行しようとすると次のようになります。

SELECT COUNT(*) AS ID 
FROM Employees i
  INNER JOIN #WeightedIDs w
  ON (i.ID = w.ID)
WHERE (i.DepartmentID = 10 and i.ShiftID = 2)

UNION ALL

SELECT i.ID FROM Employees i
  INNER JOIN #WeightedIDs w
  ON (i.ID = w.ID)
WHERE (i.DepartmentID = 10 and i.ShiftID = 2)
ORDER BY w.[Weight] ASC

どうすれば直せますか?

アップデート:

これが私が実際に達成しようとしていることです。一連のさまざまな条件に基づいて動的にクエリを生成する SPROC があります。また、ID とそれらの ID に関連付けられた重みを含む一時テーブルを作成するので、それによって結果を並べ替えたいと思います。クエリが生成されたら、カウントと見つかった ID をリストで返したいと思います。

4

2 に答える 2

5

ユニオンでは、部分的な結果ではなく、完全な結果のみを並べ替えることができます。これは、副選択を並べ替えても意味がないためです。これはリレーション/テーブルであり、(定義上)並べ替えられません。

全体的な結果を並べ替える場合は、を追加ORDER BY 1 ASCして最初の(そして唯一の)列で並べ替えることができます。最初の部分のすべての行を2番目の部分の前に置き、2番目の行を重みで並べ替える場合は、次のようにします。

select id
from
(
  SELECT COUNT(*) AS ID, 
         0 as sort_column
  FROM Employees i
    INNER JOIN #WeightedIDs w
    ON (i.ID = w.ID)
  WHERE (i.DepartmentID = 10 and i.ShiftID = 2)

  UNION ALL

  SELECT i.ID, 
         x.[Weight] 
  FROM Employees i
    INNER JOIN #WeightedIDs w
    ON (i.ID = w.ID)
  WHERE (i.DepartmentID = 10 and i.ShiftID = 2)
) x
order by sort_column

x.weightこれは、の値がゼロより大きいことを前提としています。そうでない場合は、ユニオンの最初の部分で別の(低い)値を使用する必要があります。

于 2012-08-02T17:34:49.013 に答える
1

ORDER BY を UNION の最初の SELECT に移動すると、結果セット全体が並べ替えられます。ただし、最初の SELECT である必要があり、それ以外の場所では、表示されているエラーが発生します。

于 2012-08-02T17:47:27.010 に答える