2012-02-02 29 views
1

在SQL Server 2005中,我有一个描述路径的父表,其中包含对沿每条路径的每个点的坐标的子表,就像这样:如何将选择转为删除?

路径

int path_id, string path_name 

int path_id, float x, float y, int n 

路径上的第一个点是n = 1,然后每个添加的新点增加n。

我需要做的是,删除这个返回点什么:

select [path_id] 
from Points 
where n=1 

即每个路径中的第一点,然后同时删除所有的点,其中n是该返回值:

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,但事实证明我没有。谢谢,虽然 – Melanie 2012-02-02 01:47:16

+0

@Melanie现在检查它..我改变了加入,以包括path_od和 – 2012-02-02 02:29:32

+0

好吧,如果我删除像t.point_id = points.point_id的一切,那么这似乎工作。谢谢! – Melanie 2012-02-02 02:49:27

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 2012-02-02 01:40:28

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 2012-02-02 01:49:23

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;