2012-02-02 10 views
1

は、私はこのような経路を説明する親テーブル、および各経路に沿った各点の座標が含まれている子テーブル、を有する:selectをdeleteにするにはどうすればよいですか? SQL Server 2005で

パス

int path_id, string path_name 

ポイント

int path_id, float x, float y, int n 

経路上の最初の点は、n = 1であり、nは増分追加される各新たな点です。

私は、これによって返さポイント削除されるに必要なもの、nはこれで返された値がある場合、各パスの最初の点、すなわち、

select [path_id] 
from Points 
where n=1 

をし、その後もすべてのポイントを削除します。

各パスの最後に追加されたポイントすなわち
select [path_id], max(n) 
from Points 
group by [path_id] 

最初の部分については、私はこれを行うことができます:

delete from Points 
where n=1 

を、私は第二の部分をどのように行うのですか?

答えて

1
DELETE FROM Points 
FROM points 
INNER JOIN  
(SELECT point_id, path_id, n 
FROM (SELECT ROW_NUMBER() OVER(PARTITION BY path_id ORDER BY n DESC) AS RowNumber, 
       point_id, path_id, n 
     FROM points) t 
    WHERE n = 1 or RowNumber = 1 
) t on t.point_id = points.point_id and t.path_id = points.path_id and t.n = points.n 
+0

Bassamから構文エラーが、私はユニークpoint_idを持っていたと思っているが、それは私にはない判明します。私はt.point_id = points.point_idのようなすべてのものを削除した場合のおかげで、 – Melanie

+0

@Melanieはそれをチェックアウトしても、今..私はpath_odとn –

+0

を含めるように参加する変更オーケー、これは動作しているようです。ありがとう! – Melanie

0

第二部のためにこれを試してみてください:

DELETE from points where path_id in 
(
    Select path_id from (
    select [path_id], max(n) 
    from Points 
    group by [path_id] 
    ) t 
) 
+0

私が得るすべてはカッコ... – Melanie

0

私はこの答えは、SQL Serverに適用されるとは思わないが、それはIN演算子とのタプルをサポートするデータベースで行うことができる方法を示すために、 :ここでは

DELETE FROM Points 
WHERE (path_id, n) IN 
    (SELECT path_id, max(n) 
    FROM Points 
    GROUP BY path_id) 
+0

いいえ、それは動作しませんが、少なくとも私には意味があります。ありがとう。 – Melanie

0

はピンチで動作しますアプローチです:

create table dummy as (
    select path_id, max(n) 
    from points 
    group by path_id 
); 

delete from points where n in 
    select n from dummy where points.path_id = dummy.path_id 
); 

drop table dummy; 
関連する問題