2 つのテーブルを作成しています 1 つには温度センサーのリスト (最後の測定値を含む) があり、もう 1 つは各測定の履歴値があります
テーブルは次のように定義されます。
CREATE TABLE [dbo].[History](
[SensorID] [int] NOT NULL,
[TimeStamp] [datetime] NOT NULL,
[Temperature] [float] NOT NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[Sensors](
[SensorID] [int] NOT NULL,
[Name] [nvarchar](50) NOT NULL
) ON [PRIMARY]
Sensors テーブルにもTemperature
最後の値を格納する列が必要ですが、追加するのを忘れてしまい、この奇妙な動作を発見したのです
最後の値が最も低い 5 つのセンサーの履歴データを取得したいと考えています。
SELECT *
FROM History
WHERE SensorID IN (SELECT TOP 5 SensorID FROM Sensors ORDER BY Temperature)
ここでの問題は、クエリが機能し、結果が返されることです (おそらく間違っています)。
- テーブルに列
Sensors
が含まれていないため、内部選択は機能しません。Temperature
個別に実行すると、期待どおりに失敗します。ORDEr BY のドキュメントには、列は SELECT または FROM テーブルで定義する必要があると記載されています。- http://technet.microsoft.com/en-us/library/ms188385.aspx - 実行計画を確認すると、Order がありません。Sensors テーブルと Left Semi Join に適用される Top と Filter のみがあります。
エイリアスを使用して簡単に修正できることを知っています。これにより、クエリが失敗します。ここでの質問は、これは SQL Server/クエリ オプティマイザーの何らかのバグですか?
SQL Server 11.0.3128 でテスト済み 注: SQL Management Studio intellisense は、ORDER BY 句を記述するときに温度列も提供します。