如何解决T-SQL-将列传递给子查询以进行过滤
我需要将列传递给子查询以进行过滤,但是我似乎无法使其正常工作。
我知道,如果我的子查询要返回单个列,那么我可以重新排列查询,这样就可以了,但是我需要子查询返回3列。
到目前为止,这是我的查询,它在抱怨:
where c.location.STDistance(l.location) is not null
order by c.Location.STDistance(l.location)
使用
无法绑定多部分标识符“ l.location”。
select
l.*,city.*
from
listings l,(select top 1 c.UnicodeName,c.name,r.code as region,cn.code as country
from cities c
inner join regions r on r.regionid = c.regionid
inner join Countries cn on cn.CountryId = r.countryid
where c.location.STDistance(l.location) is not null
order by c.Location.STDistance(l.location)) as city
实际计划 https://www.brentozar.com/pastetheplan/?id=BkiRk-74P
城市和商家信息索引
CREATE SPATIAL INDEX [256_HHHH] ON [dbo].[Listings]
(
[Location]
)USING GEOGRAPHY_GRID
WITH (GRIDS =(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH),CELLS_PER_OBJECT = 256,PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,SORT_IN_TEMPDB = OFF,DROP_EXISTING = OFF,ONLINE = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE SPATIAL INDEX [16_HHHH] ON [dbo].[Listings]
(
[Location]
)USING GEOGRAPHY_GRID
WITH (GRIDS =(LEVEL_1 = HIGH,CELLS_PER_OBJECT = 16,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
解决方法
您要描述的是横向联接,其中联接的子查询使用listing
表中的列。由于from
子句中的逗号,此操作失败:某些数据库的确可以识别这种隐式横向联接,但不能识别SQL Server。
您必须明确说明连接类型(无论如何都是最佳做法):使用cross apply
。
select l.*,city.*
from listings l
cross apply (
select top (1) c.UnicodeName,c.name,r.code as region,cn.code as country from cities c
inner join regions r on r.regionid = c.regionid
inner join Countries cn on cn.CountryId = r.countryid
where c.location.STDistance(l.location) is not null
order by c.Location.STDistance(l.location)
) as city
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。