0

MSSQL-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]

ここで何が問題なのですか?

アップデート

私はすべて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".
4

2 に答える 2

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

segment_id編集します。2番目のエラーについては、に含める必要がありますが、CTEでroads_by_segmentを選択しているようには見えません。Segment_idby_segment

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]
于 2013-02-21T18:36:32.343 に答える
1

列が複数のテーブルに存在する場合は、テーブル名で列を修飾する必要があります。row_number 関数で、Road.Road_ID または Segment_ID.Road_ID を指定します。LEFT JOIN を実行しているため、Road.Road_ID を使用します。Segment_ID.Segment_ID または Track.Segment_ID についても同様です。

于 2013-02-21T18:36:52.553 に答える