2013-02-21 36 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