2013-02-19 5 views
5

Привет У меня есть следующий SQL-запрос, который дает мне Scheme_Id, которые существуют как в ProjectSchemes и Схемы таблицы. Я хочу удалить все записи из Схемы таблица, у которой нет записи ProjectSchemes таблица. Как я могу это сделать? Пожалуйста помоги. Я использую MSSQLКак удалить записи НЕ

select scheme_id from Schemes where Scheme_Id 
in(select s.Scheme_Id from Projects p 
inner join ProjectSchemes ps on ps.Project_Id=p.Project_Id 
inner join Schemes s on s.Scheme_Id=ps.Scheme_Id) 

Я пытаюсь сделать следующее, но он не работает. Не работает средство записи не затронуты, но, как я проверил свою таблицу Схемы есть так много записей, что их scheme_id не могут быть найдены на столе ProjectSchemes

delete from Schemes where Scheme_Id 
not in(select s.Scheme_Id from Projects p 
inner join ProjectSchemes ps on ps.Project_Id=p.Project_Id 
inner join Schemes s on s.Scheme_Id=ps.Scheme_Id) 
+0

Что означает «не работает»? – wallyk

+0

Что вы получили? – uvinod

+0

Ваш суб-выбор, вероятно, возвращает значения NULL. См. Ответ Раччи для решения. И вы должны указать свою СУБД. –

ответ

8

Я хотел бы начать с предположений.

  1. У вас есть цепочечная модель данных: Проекты - * ProjectSchemes - * Схемы
  2. Ваша цель должна иметь только действительные цепи, так что нет ProjectSchemes без проекта, нет Схемы без ProjectSchemes.
  3. NULL не является допустимым значением для одного из ваших идентификаторов.
  4. Всех идентификаторы являются уникальными в своей таблице
  5. Вы не использовать реляционные механизмы целостности базы данных

В результате селектов бы перечислить scheme_id для всех схем в таблице схем.

Сказал, что вы должны удалить все объекты ProjectSchemes без соответствующего проекта. Это ProjectSchemes с идентификатором NULL или идентификатором, который не существует в таблице проектов:

DELETE ProjectSchemes WHERE (Project_Id is NULL) OR 
(NOT EXISTS (SELECT * FROM Projects WHERE 
      Projects.Project_Id = ProjectSchemes.Project_Id)) 

После удаления ProjectsSchemes без проекта мы теперь можем иметь несколько новых детей-сирот в таблице Схемы. Следующее, что теперь, чтобы удалить все схемы, которые имеют идентификатор NULL или идентификатор, который не существует в ProjectsSchemes таблице:

DELETE Schemes WHERE (Scheme_Id is NULL) OR 
(NOT EXISTS (SELECT * FROM ProjectSchemes WHERE 
      ProjectSchemes.Scheme_Id = Schemes.Scheme_Id)) 

Существует еще шанс, чтобы иметь схемы, которые не связаны с проектом без удаление ProjectSchemes.

+0

Работает как шарм !!!! Вы действительно понимаете проблемы. Спасибо за помощь, теперь я смог избавиться от этих записей !!! –

8
DELETE FROM schemes 
WHERE scheme_id NOT IN (
    SELECT DISTINCT scheme_id 
    FROM projectschemes 
    WHERE scheme_id IS NOT NULL 
) 

Или вы можете альтернативно использовать

DELETE 
FROM schemes 
WHERE NOT EXISTS (
     SELECT 1 
     FROM projectschemes 
     WHERE projectschemes.scheme_id = schemes.ID 
    ) 
+0

Хороший улов. И обойти проблему с 'NULL' и 'NOT IN'. –

+0

У меня ошибка «Неверный синтаксис рядом с». » ГДЕ имеет красное подчеркивание. Я использую MSSQL –

+2

Редактирование сделано. Это должно сработать. – Rachcha

3
DELETE s 
FROM Schemes s LEFT JOIN ProjectSchemes ps ON s.Scheme_Id=ps.Scheme_Id 
WHERE ps.Scheme_Id IS NULL 

Но звучит, как вам нужно это

DELETE sp 
FROM ProjectSchemes sp LEFT JOIN Schemes s ON sp.Scheme_Id=s.Scheme_Id 
WHERE s.Scheme_Id IS NULL 
+0

Я пробовал этот запрос, но он говорит: «(0 строк затронуто)», может быть, не найдено записей ps.Scheme_Id IS NULL? ProjectScheme.Scheme_Id имеет записи и нет записи, на которой есть NULL. Случилось так, что как схемы, так и ProjectSchemes не были соблюдены FK, поэтому на страницах проектов так много записей, которые не имеют записи в таблице Схемы. –

+0

Если этот запрос вы скажете (0 строк затронуты), то это означает, что в таблице Схемы нет записей, которые не связаны с таблицей ProjectSchemes –

+0

Возможно, вам нужно удалить записи из таблицы ProjectSchemes, которые не привязаны к таблице Схемы? –

Смежные вопросы