为什么相关子查询不允许两个表达式 - SQL Server



>我有这样的查询:

select 
    objectid,
    (select top 1 data_source, maxspeed
     from SpeedLimitData3
     where way_geometry.Filter(geography::STGeomFromText('POINT (' + cast(X as varchar(15)) + ' ' + cast(Y as varchar(15)) + ')', 4326)) = 1
     order by way_geometry.STDistance(geography::STGeomFromText('POINT (' + cast(X as varchar(15)) + ' ' + cast(Y as varchar(15)) + ')', 4326))
    )
from 
    testData

为什么 SQL Server 会引发此错误?

Msg 116,级别 16,状态 1,第 8
行 当子查询未随 EXISTS 一起引入时,只能在选择列表中指定一个表达式。

我知道这意味着我需要删除子查询的选定列之一。但是为什么当我将单行作为子查询结果而不是几行时?

Transact-SQL 中 select 子句的语法允许由各种实体组成的<select-list>。select 子句中使用的相关子查询是一个expression,它提供单个结果列的值。

这将

起作用,但将在选择的OTR.*部分中输出相同的数据。您必须在测试数据和应用关联中使用相关字段

select objectid, otr.*
from testData
outer apply
    (
    select top 1 data_source, maxspeed
    from SpeedLimitData3
    where way_geometry.Filter(geography::STGeomFromText('POINT (' + cast(X as varchar(15)) + ' ' + cast(Y as varchar(15)) + ')', 4326)) = 1
    order by way_geometry.STDistance(geography::STGeomFromText('POINT (' + convert(varchar(15),X) + ' ' + convert(varchar(15),Y) + ')', 4326))
    ) otr

如果 X 和 Y 是 testData 中的字段

select tD.objectid, otr.*
from testData tD
outer apply
    (
    select top 1 data_source, maxspeed
    from SpeedLimitData3
    where way_geometry.Filter(geography::STGeomFromText('POINT (' + convert(varchar(15),tD.X) + ' ' + convert(varchar(15),tD.Y) + ')', 4326)) = 1
    order by way_geometry.STDistance(geography::STGeomFromText('POINT (' + convert(varchar(15),tD.X) + ' ' + convert(varchar(15),tD.Y) + ')', 4326))
    ) otr

最新更新