2013-02-19 11 views
5

Hallo habe ich die folgende SQL-Abfrage, die mir gibt Scheme_Id die beide existieren in ProjectSchemes und Schemes Tabelle. Ich möchte alle Datensätze von Schemas Tabelle löschen, die keinen Datensatz zu ProjectSchemes Tabelle haben. Wie kann ich das tun? Bitte helfen Sie. Ich verwende MSSQLSo löschen Sie Datensätze NICHT 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) 

Ich versuche, das folgende zu tun, aber es funktioniert nicht. Ein Problem Mittel keine Datensätze betroffen, aber wie ich meine Schemes Tabelle überprüft, es gibt so viele Datensätze, die ihre scheme_id nicht auf der ProjectSchemes Tabelle entnommen werden können

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

Was bedeutet "nicht funktioniert"? – wallyk

+0

Was bekommen Sie zurück? – uvinod

+0

Ihr Subselect gibt wahrscheinlich NULL-Werte zurück. Siehe Rachchas Antwort für eine Lösung. Und Sie sollten Ihr DBMS angeben. –

Antwort

8

Ich möchte mit Annahmen beginnen.

  1. Sie haben ein kettenDatenModell: Projekte - * ProjectSchemes - * Schemes
  2. Ihr Ziel ist nur dann gültig, Ketten zu haben, also keine ProjectSchemes ohne Projekt, keine Schemes ohne ProjectSchemes.
  3. NULL ist kein gültiger Wert für eine Ihrer IDs.
  4. Alle IDs sind einzigartig in ihrer Tabelle
  5. Sie referentielle Integrität Mechanismen der Datenbank nicht für alle Systeme in der Schemes Tabelle

Als Ergebnis der SELECT-listet die scheme_id verwenden.

Das besagt, dass Sie anfangen sollten, alle ProjectSchemes ohne ein entsprechendes Projekt zu löschen. Dies sind ProjectSchemes mit einer ID von NULL oder eine ID, die nicht in der Tabelle Projekte nicht vorhanden ist:

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

Nach dem ProjectsSchemes Löschen ohne Projekt, das wir jetzt einige neue Waisen in den Schemata der Tabelle haben. Das nächste, was ist jetzt alle Schemata zu löschen, die eine ID von NULL oder eine ID haben, die nicht in der ProjectsSchemes Tabelle nicht vorhanden ist:

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

Es gibt noch eine Chance, Systeme zu haben, die nicht mit einem Projekt verbunden ist, ohne Löschen der ProjectSchemes.

+0

Funktioniert wie ein Charme! Du verstehst wirklich die Probleme. Danke für die Hilfe jetzt konnte ich diese Aufzeichnungen loswerden !!! –

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

Oder Sie können alternativ

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

Guter Fang. Und umgeht das Problem mit 'NULL's und' NOT IN's auch. –

+0

Ich habe den Fehler "Falsche Syntax in der Nähe von 's" erhalten. Die WHERE hat rot unterstrichen. Ich benutze MSSQL –

+2

Edit done. Das sollte funktionieren. – Rachcha

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

Aber klingt wie Sie diese

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

Ich versuchte diese Abfrage, aber es sagt "(0 Zeile (n) betroffen)" möglicherweise keine Datensätze gefunden ps.Scheme_Id ist NULL? ProjectScheme.Scheme_Id enthält Datensätze und es gibt keinen Eintrag, der NULL enthält. Es kam vor, dass beide Schemas und ProjectSchemes nicht von FK erzwungen wurden. Deshalb gibt es so viele Datensätze in Projektschemas, die keinen Eintrag in der Schematabelle haben. –

+0

Wenn diese Abfrage Sie (0 Zeile (n) betroffenen) sagen, bedeutet es, dass in Schemata-Tabelle nicht Datensätze, die nicht mit ProjectSchemes-Tabelle –

+0

verbunden sind Vielleicht möchten Sie Datensätze aus ProjectSchemes-Tabelle löschen, die nicht zugeordnet Schemata-Tabelle? –

Verwandte Themen