2013-02-21 14 views
-1

Im MS SQL Server新增功能。我有這個問題。
我有一個查詢:查詢中的一些錯誤

with by_segment as (
SELECT 
    Road.Road_ID, 
    GEOMETRY::STGeomFromText(Track.Track.STAsText(),4326) as the_geom, 
    row_number() over (partition by road_id order by Segment_Id) as [rn], 
    count(*) over (partition by road_id) as [c] 
FROM dbo.Road 
LEFT JOIN Segment_ID ON Road.Road_ID = Segment_ID.Road_ID 
LEFT JOIN Track ON Segment_ID.Segment_ID = Track.Segment_ID 
), 
roads_by_segment as (
select 
    road_id, 
    the_geom, 
    [rn], 
    [c] 
from by_segment 
where [rn] = 1 

union all 

select 
    [a].road_id, 
    [a].the_geom.STUnion([b].the_geom), 
    [b].[rn], 
    [b].[c] 
from by_segment as [a] 
inner join roads_by_segment as [b] 
    on [a].segment_id = b.[segment_id] 
    and [a].[rn] = [b].[rn]+1 
) 

select * from roads_by_segment where [rn] = [c] 

,但得到的錯誤(我嘗試從俄語翻譯):

Message 209, level 16, state 1, line 5 
Ambiguous column name "road_id". 
Message 209, level 16, state 1, line 5 
Ambiguous column name "Segment_Id". 
Message209, level 16, state 1, line 6 
Ambiguous column name "road_id". 

線5和6:

row_number() over (partition by road_id order by Segment_Id) as [rn], 
    count(*) over (partition by road_id) as [c] 

哪些錯誤會在這裏?

UPDATE

我從bluefeet答案盡在行獲得新的錯誤:

on [a].segment_id = b.[segment_id] 

它說:

Message 207, level 16, state 1, line 29 
Ambiguous column name "segment_id". 
Message 207, level 16, state 1, line 29 
Ambiguous column name "segment_id". 

回答

3

你必須與表前言road_id它來自於。只要你有多個表具有相同名稱的列,您需要使用表名前言列:

with by_segment as (
SELECT 
    Road.Road_ID, 
    GEOMETRY::STGeomFromText(Track.Track.STAsText(),4326) as the_geom, 
    row_number() over (partition by Road.road_id order by Segment_ID.Segment_Id) as [rn], 
    count(*) over (partition by Road.road_id) as [c] 
FROM dbo.Road 
LEFT JOIN Segment_ID ON Road.Road_ID = Segment_ID.Road_ID 
LEFT JOIN Track ON Segment_ID.Segment_ID = Track.Segment_ID 
), 

注:我以前Road.但您可能需要使用Segment_ID

編輯,第二個錯誤,你需要包括在roads_by_segmentsegment_id,它不會出現你在by_segment CTE選擇Segment_id

with by_segment as 
(
    SELECT 
     Segment_ID.Segment_ID, 
     Road.Road_ID, 
     GEOMETRY::STGeomFromText(Track.Track.STAsText(),4326) as the_geom, 
     row_number() over (partition by Road.road_id order by Segment_ID.Segment_Id) as [rn], 
     count(*) over (partition by Road.road_id) as [c] 
    FROM dbo.Road 
    LEFT JOIN Segment_ID ON Road.Road_ID = Segment_ID.Road_ID 
    LEFT JOIN Track ON Segment_ID.Segment_ID = Track.Segment_ID 
), 
roads_by_segment as 
(
    select 
     road_id, 
     the_geom, 
     [rn], 
     [c], 
     [segment_id] 
    from by_segment 
    where [rn] = 1 
    union all 
    select 
     [a].road_id, 
     [a].the_geom.STUnion([b].the_geom), 
     [b].[rn], 
     [b].[c], 
     [b].[segment_id] 
    from by_segment as [a] 
    inner join roads_by_segment as [b] 
     on [a].segment_id = b.[segment_id] 
     and [a].[rn] = [b].[rn]+1 
) 

select * from roads_by_segment where [rn] = [c] 
+0

+1擊敗我。 – Kermit 2013-02-21 18:37:00

+0

+1 - 不要忘了Segment_ID.Segment_ID以及 – sgeddes 2013-02-21 18:37:16

+0

@sgeddes你是對的,修復 – Taryn 2013-02-21 18:38:01

1

如果列存在於多個表中,則需要使用表名限定列。在row_number函數中指定Road.Road_ID或Segment_ID.Road_ID。由於您正在進行LEFT JOIN,因此您需要使用Road.Road_ID。 Segment_ID.Segment_ID或Track.Segment_ID同樣如此。

+0

是的,謝謝我做它和它的工作。但是現在我在另一行有同樣的錯誤,你能幫助我們嗎? – 2013-02-21 18:43:53