SQL: Fehlende Einträge/Verknüpfungen in Kreuztabelle finden/schreiben

edit | delete

Autor: Ralf v.d.Mark

eingetragen: Mittwoch, 08. November 2017 um 12:35 Uhr (45/2017 Kalenderwoche)

geändert: Donnerstag, 02. Mai 2019 um 12:34 Uhr (18/2019 Kalenderwoche)

Keywords: kreuztabelle verknüpfungen join exist

Kategorien: DB: MySQL, DB: MariaDB,

Text:

SQL, um die nicht existierenden Einträge in einer Kreuztabelle/Verknüpfungstabelle zu finden.


Die zweite Query schreibt alle fehlenden Einträge in die Verknüpfungstabelle.



Gefunden in:
https://www.php.de/forum/webentwicklung/datenbanken/27165-insert-i...


https://dev.mysql.com/doc/refman/8.0/en/insert-select.html

Quellcode:  

-- Findet die fehlenden Eintraege in der Verknuepfungstabelle
SELECT   h.id
FROM     hauptTabelle AS h
LEFT JOIN  kreuzVerknTabelle AS v
    	ON (v.id = h.id)
WHERE    v.id IS NULL
ORDER BY h.id ASC;


-- Schreibt die fehlenden Eintraege in die Verknuepfungstabelle
INSERT INTO kreuzVerknTabelle (fk_id, feld1, feld2, update_ts)
    SELECT id AS fk_id, 
           feld_in_hauptabelle AS feld1, 
           'irgend ein Text' AS feld2,
            NOW() AS update_ts 
    FROM hauptTabelle 
    WHERE  (id IN (
        SELECT  h2.id
        FROM  hauptTabelle AS h2
        LEFT JOIN kreuzVerknTabelle AS v2
            ON (v2.fk_id = h2.id)
        WHERE  v2.fk_id IS NULL) 
    OR id IS NULL);


In der FPD wurde folgende "Reparatur"-Query verbaut:
INSERT INTO kenntnisnahme_log (foprojekt_id, abgeschickt_ts, abgeschickt_person, last_mail,
    referat_bezeichnung, referat_email, cc_email, bemerkung, update_ts)
    SELECT id AS foprojekt_id, 
           abgeschickt_zur_kenntnisnahme_time AS abgeschickt_ts, 
           "unbekannt" AS abgeschickt_person, 
           "Kein Text bekannt" AS last_mail, 
           "999" AS referat_bezeichnung, 
           "Betreuungsreferat" AS referat_email, 
           "Forschungsreferat und zust. Ref. aus Forschungsprojekt" AS cc_email, 
           "Datensatz durch Import" AS bemerkung,
           NOW() AS update_ts 
    FROM f_foprojekt 
    WHERE  (id IN (
        SELECT       h.id
        FROM         f_foprojekt AS h
        LEFT JOIN kenntnisnahme_log AS v
            ON (v.foprojekt_id = h.id 
               AND (v.kenntnisnahme_ts IS NULL OR LENGTH(v.kenntnisnahme_ts ) < 1))
        WHERE  v.foprojekt_id IS NULL
        AND    LENGTH(h.abgeschickt_zur_kenntnisnahme_token) > 1
        AND    h.erfassungsstand_seite = 0
        AND    h.foprojekte_del = 0
        ORDER BY h.id ASC) 
    OR id IS NULL);