Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сложный DELETE 
:(
    Опции темы
infarch
Дата 3.4.2014, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Здравствуйте.
Мне нужно отрефакторить кусок программы с несколькими 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


Я хочу выборку и удаление сделать одним запросом, избавившись от цикла. Возможно ли это без использования курсоров? Не хочу курсор ибо это фактически перенос цикла из программы на сервер, без качественного улучшения.
PM MAIL   Вверх
Akina
Дата 3.4.2014, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Код

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



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
infarch
Дата 3.4.2014, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0564 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.