2013-02-19 9 views
5

Witam mam następujące zapytanie SQL, które daje mi Scheme_Id które występują zarówno w ProjectSchemes i schematach stołowych. Chcę usunąć wszystkie rekordy z tabeli Schematy, które nie mają rekordu tabeli ProjectSchemes. Jak mogę to zrobić? Proszę pomóż. Używam MSSQLJak usuwać rekordy NOT IN

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) 

Próbuję wykonać następujące czynności, ale to nie działa. Nie oznacza, że ​​nie rekordy dotknięte działa, ale jak sprawdziłem mój stół Schematy istnieje tak wiele rekordów, że ich scheme_id nie można znaleźć na stole 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

Co oznacza "nie działa"? – wallyk

+0

Co otrzymałeś? – uvinod

+0

Twój podselekcja prawdopodobnie zwraca wartości NULL. Zobacz odpowiedź Rachcha na rozwiązanie. I powinieneś podać swój DBMS. –

Odpowiedz

8

Chciałbym zacząć od założeń.

  1. Masz chainlike model danych: projekty - * - * ProjectSchemes Schematy
  2. Twoim celem jest, aby mieć tylko poprawne łańcuchy, więc nie ProjectSchemes bez projektu, ma programów bez ProjectSchemes.
  3. NULL nie jest prawidłową wartością dla jednego ze swoich identyfikatorów.
  4. Wszystkie identyfikatory są unikalne w ich stolika
  5. Nie używać mechanizmów więzów integralności bazy

W rezultacie twój SELECT będzie notować scheme_id dla wszystkich programów w tabeli schematach.

Powiedział, że powinieneś zacząć usuwać wszystkie ProjectSchemes bez odpowiedniego projektu. Są ProjectSchemes z identyfikatorem NULL lub ID, który nie istnieje w projektach tabeli:

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

Po usunięciu ProjectsSchemes bez projektu mamy teraz może mieć kilka nowych sierot w tabeli schematach. Następną rzeczą jest, aby usunąć wszystkie programy, które mają identyfikator zerowy lub identyfikator, który nie istnieje w ProjectsSchemes tabeli:

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

Jest jeszcze szansa na programy, które nie są związane z projektem bez usuwanie ProjectSchemes.

+0

Działa jak urok !!!! Naprawdę rozumiesz problemy. Dzięki za pomoc, udało mi się pozbyć tych nagrań !!! –

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

Albo można alternatywnie użyć

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

Dobry połów. I rozwiązuje problem z 'NULL's i' NOT IN' również. –

+0

Wystąpił błąd "Niepoprawna składnia w pobliżu" s "." GDZIE ma czerwone podkreślenie. Używam edycji MSSQL –

+2

Edytuj. To powinno działać. – Rachcha

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

Ale brzmi jak trzeba to

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

Próbowałem tego zapytania, ale mówi "(dotyczy 0 wierszy)" może nie znaleziono rekordów ps.Scheme_Id IS NULL? ProjectScheme.Scheme_Id ma rekordy i nie ma wpisu, który ma NULL na nim. Zdarzyło się, że zarówno Schematy, jak i ProjectSchemes nie zostały wymuszone przez FK, dlatego jest tak wiele zapisów na temat projektów, które nie mają wpisu w tabeli Schematy. –

+0

Jeśli to zapytanie powiesz (dotyczy 0 wierszy), oznacza to, że w tabeli schematów nie ma rekordów, które nie są powiązane z tabelą ProjectSchemes. –

+0

Może chcesz usunąć rekordy z tabeli ProjectSchemes, która została powiązana z tabelą Schematy? –

Powiązane problemy