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

Why correlated subquery doesn't allow two expressions - 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 服务器抛出这个错误?

Msg 116, Level 16, State 1, Line 8
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

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

这会起作用,但会在 select 的 otr.* 部分输出相同的数据。 您必须在 testData 中使用相关字段并应用相关性

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

在 select 子句中使用的 select clause in Transact-SQL allows a <select-list> made up of various entities. A correlated subquery 的语法是 expression 并为单个结果列提供值。