>我有这样的查询:
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