Alle Personen die anonymisiert werden dürfen

lapadula

Aktiver Benutzer
Beiträge
33
Alle Personen die anonymisiert werden dürfen

Hallo, ich habe schwierigkeiten bei einer Abfrage, die alle Personen ermitteln soll, welche theoretisch gelöscht werden können aber aufgrund von Fremdschlüssel-Beziehungen in anderen Tabellen nicht gelöscht werden können.

Ich möchte also als erstes alle Personen, die in irgendeiner Tabelle referenziert sind. Zeitgleich muss aber in ALLEN dieser Tabellen der Zweck der Speicherung entfallen sein.

Ich habe in etwa 10 Tabellen, wo die Person refereneziert ist, als Beispiel nehme ich hier zwei fiktive.

In der einen Tabelle sind Notizen zur Person hinterlegt. Wenn die Person alle Notizen gelesen hat oder wenn es keine gibt, dann ist der Zweck entfallen.
In der zweiten Tabelle sind Verträge zur Person hinterlegt. Wenn alle Verträge abgelaufen sind oder es keine gibt, dann ist der Zweck entfallen.

Mein Versuch sieht so aus:

Code:
SELECT
    *
FROM
    Person person
WHERE
(
    (EXISTS (SELECT personID FROM Notiz WHERE person.ID = FK_personID)) OR
    (EXISTS (SELECT personID FROM Vertrag WHERE person.ID = FK_personID))
)
AND
(
    (SELECT COUNT(*) FROM Notiz WHERE person.ID = FK_personID AND gelesen = 0) = 0
    OR
    (SELECT COUNT(*) FROM Vertrag WHERE person.ID = FK_personID AND Endedatum < GETDATE()) = 0
)

Das Ergebnis ist falsch. Ich müsste irgendwie ja wissen, welches Tabellen aus dem Ersten Bedingungs-Block ausgegeben werden, also welche Tabellen Einträge haben, damit ich die Bedingungen im zweiten Block mit AND verknüpfen kann.

Bitte um Hilfe
 
Werbung:
um es mal in etwas nachzuvollziehen.

Code:
test=*# select * from personen ;
 id |  name   
----+---------
  1 | person1
  2 | person2
  3 | person3
  4 | person4
(4 rows)

test=*# select * from notiz ;
 pid |   n    | valid
-----+--------+-------
   2 | notiz2 | t
   3 | notiz3 | f
(2 rows)

test=*# select * from vertrag ;
 pid |    v     | valid
-----+----------+-------
   1 | vertrag1 | t
   3 | vertrag3 | f
(2 rows)

wir haben also den einen Eintrag mit pid=3, der in allen (hier 2) Referenzen valid=false hat.

Code:
test=*# with del as (select pid from notiz where not valid union all select pid from vertrag where not valid) select pid, count(1) from del group by pid having count(1) = 2;
 pid | count
-----+-------
   3 |     2
(1 row)

Damit hast nun die pid=3, die gesucht ist.


Hilft das?
 
Scheint mir etwas umständlich.
Rezept:
Alle Löschmengen selektieren und per full join mit der Löschtabelle verbinden. Das ergibt ganz klassisch und automisch die Menge, wo alle gleichzeitig dabei sind.
 
Werbung:
Zurück
Oben