0

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 句を記述するときに温度列も提供します。

4

0 に答える 0