Ich habe eine DB2-Tabelle (messages
), die Nachrichten zwischen Benutzern verfolgt. Es gibt eine Spalte für message_id
sowie eine Spalte zum Verfolgen von Antworten mit der Bezeichnung response_id
(message.response_id
ist codiert auf die message.id
das ist die erste Nachricht in einem Thread, so dass alle Nachrichten in einem bestimmten Thread mit Ausnahme der allerersten die gleiche response_id
, während die erste Nachricht in einem Thread hat eine null
).SQL-Abfrage für die Anzahl und existiert
Es gibt eine andere Tabelle (reads
), die auf einer Nachricht Spuren liest, und zurück in die messages
Tabelle durch eine Spalte namens reads.message_id
FK'd.
Aufgrund eines Fehlers wurden einige Nachrichtenlesevorgänge nicht aufgezeichnet.
Ich brauche alle message
s zu finden, wo message.response_id
nicht null ist (so dass sie nicht die übergeordnete Nachricht), die nicht einen Datensatz in reads
(nichts, wo reads.message_id = message.id
), sondern, dass die Elternnachricht DOES eine gültige read
haben haben DO (so gibt es für ein gegebenes Kind message
, gibt es einen Datensatz passend reads.message_id = message.response_id
).
Ist das möglich? Oder sollte ich nur die Hauptmeldungs-Tabelle abfragen, alle Elemente erfassen, in denen nicht null ist, dann eine andere Abfrage von denen, um festzustellen, ob der übergeordnete Datensatz einen read
Datensatz hat?
PSEUDO-SQL:
SELECT * FROM messages m WHERE m.response_id IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM reads r WHERE m.id = r.message_id)
AND EXISTS (SELECT 1 FROM reads r2 WHERE m.response_id = r2.message_id)
Ich vermisse etwas, aber ich denke, Ihre "Pseudo-SQL" sieht wie tatsächliche SQL, die genau das tun sollten, was Sie wollen. Wie genau ist es zu kurz? –