Как превратить выбор в удаление? - PullRequest
1 голос
/ 02 февраля 2012

В 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

а как мне сделать вторую часть?

Ответы [ 4 ]

1 голос
/ 02 февраля 2012
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 голосов
/ 02 февраля 2012

Вот подход, который будет работать в крайнем случае:

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;
0 голосов
/ 02 февраля 2012

Я не думаю, что этот ответ применим к SQL Server, но чтобы показать, как это можно сделать с базами данных, которые поддерживают кортежи с оператором IN:

DELETE FROM Points
WHERE (path_id, n) IN
    (SELECT path_id, max(n)
     FROM Points
     GROUP BY path_id)
0 голосов
/ 02 февраля 2012

Попробуйте это для второй части:

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