我正在创建两个表一个有温度传感器列表(包括最后一个测量值)另一个有每个测量的历史值
表定义如下:
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 子句时还提供温度列