Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Сложный DELETE


Автор: infarch 3.4.2014, 11:27
Здравствуйте.
Мне нужно отрефакторить кусок программы с несколькими SQL запросами.

Есть таблица:
Код

CREATE TABLE [ProjectUserLinked](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Project_ID] [int] NULL,
    [LinkColor_ID] [int] NULL,
    [ProjectUser_ID] [int] NOT NULL,
 CONSTRAINT [PK_ProjectUserLinked] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


Сначала собирается информация:
Код

SELECT Project_ID,LinkColor_ID FROM ProjectUserLinked WITH(nolock) GROUP BY Project_ID,LinkColor_ID HAVING count(ProjectUser_ID) = 1


Далее в программе работает цикл, который проходит по результатам и выполняет другой запрос на удаление:
Код

DELETE FROM ProjectUserLinked WHERE Project_ID=$project_id AND LinkColor_ID=$linkcolor_id


Я хочу выборку и удаление сделать одним запросом, избавившись от цикла. Возможно ли это без использования курсоров? Не хочу курсор ибо это фактически перенос цикла из программы на сервер, без качественного улучшения.

Автор: Akina 3.4.2014, 11:41
Код

DELETE ProjectUserLinked.*
FROM ProjectUserLinked,
(
  SELECT Project_ID,LinkColor_ID 
  FROM ProjectUserLinked WITH(nolock) 
  GROUP BY Project_ID,LinkColor_ID 
  HAVING count(ProjectUser_ID) = 1
) As subquery
WHERE ProjectUserLinked.Project_ID=subquery.project_id 
  AND ProjectUserLinked.LinkColor_ID=subquery.linkcolor_id

Автор: infarch 3.4.2014, 13:28
Огромное спасибо!
Я немного упростил запрос. Работает так же, но я хотел бы услышать мнение опытного человека, нет ли тут подводных камней?
Код

DELETE ProjectUserLinked
FROM
(
  SELECT Project_ID,LinkColor_ID 
  FROM ProjectUserLinked WITH(nolock) 
  GROUP BY Project_ID,LinkColor_ID 
  HAVING count(ProjectUser_ID) = 1
) As subquery
WHERE ProjectUserLinked.Project_ID=subquery.project_id 
  AND ProjectUserLinked.LinkColor_ID=subquery.linkcolor_id

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)