SQL: Fehlende Einträge/Verknüpfungen in Kreuztabelle finden/schreiben
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);