2017-05-03 1 views
1

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) 
+2

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? –

Antwort

0

You "Pseudo-SQL" tatsächlich echte SQL ist und funktionieren sollte.

Sie schließt sich als Alternative verwenden:

select * from messages m 
    join reads r2 on m.response_id = r2.message_id 
    left join reads r on m.id = r.message_id 
    where r.message_id is null 

In einigen Fällen ist dies effizienter sein kann. Abhängig von Ihren Daten müssen Sie möglicherweise die Ergebnisse duplizieren.

Nicht, dass ich die Überprüfung entfernt habe, ob response_id null ist, weil es von der ersten Verknüpfung erzwungen wird.

0

Das klingt wie ein Grund not exists:

select m.* 
from messages m 
where m.response_id is not null and 
     not exists (select 1 from messages m2 where m2.id = m.response_id); 
+0

das ist nah, ich habe einige psuedo sql oben hinzugefügt, um klarer zu machen, wonach ich suche – user101289

Verwandte Themen