Can STWithin or STContains be used to update colum

2019-07-20 12:50发布

Given the following tables:

CREATE TABLE #USGS_24K_TOPOMAP_BOUNDARIES(
    [OBJECTID] [int] NOT NULL,
    [AREA] [numeric](38, 8) NULL,
    [PERIMETER] [numeric](38, 8) NULL,
    [QD24K_GRSM] [numeric](38, 8) NULL,
    [QD24K_GR_1] [numeric](38, 8) NULL,
    [QUADID] [numeric](38, 8) NULL,
    [CENTLAT] [numeric](38, 8) NULL,
    [CENTLONG] [numeric](38, 8) NULL,
    [NAME] [nvarchar](35) NULL,
    [STATE] [nvarchar](2) NULL,
    [LATLONG] [nvarchar](9) NULL,
    [OHIO_INDEX] [nvarchar](8) NULL,
    [GRID60] [nvarchar](5) NULL,
    [Reviewed] [int] NULL,
    [Corrected] [int] NULL,
    [Verified] [int] NULL,
    [GlobalID] [uniqueidentifier] NOT NULL,
    [SHAPE] [geometry] NULL)

and

CREATE TABLE #tbl_locations(

[OBJECTID] [int] NOT NULL,
[FCategory] [varchar](16) NULL,
[MapMethod] [varchar](4) NULL,
[HError] [varchar](50) NULL,
[MapSource] [varchar](255) NULL,
[SourceDate] [datetime2](7) NULL,
[EditDate] [datetime2](7) NULL,
[Notes] [varchar](255) NULL,
[Species_Community] [varchar](50) NULL,
[Location_ID] [uniqueidentifier] NOT NULL,
[Site_ID] [uniqueidentifier] NULL,
[GIS_Location_ID] [varchar](50) NULL,
[Meta_MID] [varchar](50) NULL,
[X_Coord] [numeric](38, 8) NULL,
[Y_Coord] [numeric](38, 8) NULL,
[Coord_Units] [varchar](50) NULL,
[Coord_System] [varchar](50) NULL,
[UTM_Zone] [varchar](50) NULL,
[Accuracy_Notes] [varchar](255) NULL,
[Unit_Code] [varchar](12) NULL,
[Loc_Name] [varchar](100) NULL,
[Loc_Type] [varchar](25) NULL,
[Updated_Date] [varchar](50) NULL,
[Loc_Notes] [varchar](255) NULL,
[Datum] [varchar](5) NULL,
[Watershed] [varchar](50) NULL,
[StreamName] [varchar](50) NULL,
[NHDReachCode] [varchar](14) NULL,
[TOPO_NAME] [varchar](50) NULL,
[Trail] [varchar](100) NULL,
[Road] [varchar](50) NULL,
[Elevation] [numeric](38, 8) NULL,
[LAT] [numeric](38, 8) NULL,
[LON] [numeric](38, 8) NULL,
[Population_ID] [uniqueidentifier] NULL,
[Year_] [varchar](4) NULL,
[WGS_DAT] [varchar](5) NULL,
[WGS_CS] [varchar](5) NULL,
[County] [varchar](20) NULL,
[State] [varchar](15) NULL,
[IsExtant] [varchar](3) NULL,
[IsSenstive] [varchar](3) NULL,
[SpeciesName] [varchar](125) NULL,
[SpeciesID] [varchar](50) NULL,
[Species_ID] [int] NULL,
[SHAPE] [geometry] NULL)

I'd like to populate #tbl_locations.Topo_Name with #USGS_24K_TOPOMAP_BOUNDARIES.Name. In other words, I trying to determine the name of the topo map that a point falls within, and programatically write that to the points table. Seems simple in theory, but tbl_locations contains thousands of points which could occur in one of 36 topo map polygon boundaries.

I've gotten this far

Select NAME, Loc_Name, Location_ID
From #USGS_24K_TOPOMAP_BOUNDARIES a, #TBL_LOCATIONS b
where a.Shape.STContains(b.Shape)=1

which returns a neat table that I can cross-walk back to tbl_locations through a join, but I'm stuck on getting this accomplished through a single query-update statement, and I have many similar point-polygon relationships that I'd like to automate this way (e.g what watershed, county, state, etc... the point occurs in). THanks!

2条回答
何必那么认真
2楼-- · 2019-07-20 13:00
UPDATE 
    tbl_locations 
SET 
    tbl_locations.Topo_Name = t.Name
FROM 
    (SELECT Shape, Name FROM USGS_24K_TOPOMAP_BOUNDARIES) t
WHERE 
    t.Shape.STContains(tbl_locations.Shape) = 1 
查看更多
做个烂人
3楼-- · 2019-07-20 13:09
update TBL_LOCATIONS
set TOPO_NAME = dbo.QD24K_GRSM.NAME
--(SELECT     a.NAME, b.Loc_Name, b.Location_ID
FROM dbo.tbl_locations
inner join dbo.QD24K_GRSM 
on TBL_LOCATIONS.Location_ID = TBL_LOCATIONS.Location_ID
WHERE  (QD24K_GRSM.Shape.STContains(TBL_LOCATIONS.SHAPE) = 1) ;
查看更多
登录 后发表回答