【问题标题】:Why correlated subquery doesn't allow two expressions - SQL Server为什么相关子查询不允许两个表达式 - SQL Server
【发布时间】:2016-01-29 22:54:44
【问题描述】:

我有这样的查询:

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 会抛出这个错误?

消息 116,第 16 级,状态 1,第 8 行
当子查询不使用 EXISTS 引入时,选择列表中只能指定一个表达式。

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

【问题讨论】:

  • 只需将您的内部选择移动到 from 部分并使其交叉应用,它会做同样的事情并且您可以拥有多个列
  • @JamesZ 我已经这样做了。我的问题是为什么在相关子查询中不能有多个表达式?
  • 你的表达式在 SELECT 区域,这里只有标量。
  • @DimaSUN 我以为列+两列的行=三列,但似乎不是:)
  • c 我的答案在这里

标签: sql-server tsql subquery correlated-subquery


【解决方案1】:

Transact-SQL 中select clause 的语法允许<select-list> 由各种实体组成。在 select 子句中使用的相关 subqueryexpression,并为单个结果列提供值。

【讨论】:

    【解决方案2】:

    这会起作用,但会在选择的 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 中的字段 - 我将更改我的查询
    • 是的,它们来自 testData。
    【解决方案3】:

    如果 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      相关资源
      最近更新 更多