0

我正在创建两个表一个有温度传感器列表(包括最后一个测量值)另一个有每个测量的历史值

表定义如下:

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]

传感器表也应该有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
  • 当我检查执行计划时,没有订单。只有一个顶部和过滤器,都应用于传感器表和一个左半连接。

我知道我可以通过使用别名轻松修复它。这将使我的查询按我的意愿失败。这里的问题是,这是 SQL Server/查询优化器中的某种错误吗?

在 SQL Server 11.0.3128 上测试 注意:SQL Management studio intellisense 在编写 ORDER BY 子句时还提供温度列

4

0 回答 0