Fehler: Meine Abfrage (mit Unterabfragen) wird leer zurückgegeben

SELECT c.id,c.email,cs.Source FROM contact c INNER JOIN contactsource__C cs ON cs.contactid__c = c.id WHERE cs.Source IN (SELECT cs.Source FROM contact c INNER JOIN contactsource__C cs ON cs.contactid__c = c.id WHERE cs.Source = 'DOGS') AND cs.Source IN (SELECT cs.Source FROM contact c INNER JOIN contactsource__C cs ON cs.contactid__c = c.id WHERE cs.Source = 'CATS') 

Ich möchte eine list von E-Mails, die sowohl "DOGS" als auch "CATS" als Quelle hat.

Die Quelle wird auf getrennten Zeilen in der Tabelle: contactource, aber mit dem gleichen contact_id (das ist PK id in Tabelle: Kontakt)

Ich bekomme keine Ergebnisse, wenn ich das laufe (laufende Unterabfragen einzeln gibt Ergebnisse zurück, und es gibt Fälle, wo Quelle sowohl CATS als auch HUNDE ist, die auf separaten Zeilen notiert sind)

Ich möchte eine list von E-Mails, die sowohl "DOGS" als auch "CATS" als Quelle hat.

Wählen Sie aus nur contact und setzen Sie die Kriterien in die WHERE-Klausel:

 select id, email from contact where id in ( select contactid__c from contactsource__C where source in ('DOGS', 'CATS') group by contactid__c having count(distinct source) = 2 ); 

Alle koditionalen Säulen zu senken oder oben können arbeiten.

  SELECT c.id,c.email,cs.Source FROM contact c INNER JOIN contactsource__C cs ON cs.contactid__c = c.id WHERE lower(cs.Source) IN (SELECT lower(cs.Source) FROM contact c INNER JOIN contactsource__C cs ON cs.contactid__c = c.id WHERE cs.Source = 'DOGS') AND lower(cs.Source) IN (SELECT lower(cs.Source) FROM contact c INNER JOIN contactsource__C cs ON cs.contactid__c = c.id WHERE cs.Source = 'CATS') 

Zuerst hast du zwei identische Unterabfragen, also ist es besser, sie zusammen zu verbinden, indem du nur das Prädikat in der Unterabfrage änderst, was wird:

 SELECT cs.Source FROM contact c INNER JOIN contactsource__C cs ON cs.contactid__c = c.id WHERE cs.Source = 'DOGS' or cs.Source = 'CATS'; 

Aber ich weiß nicht, was Sie erwarten, dass die Unterabfrage zu produzieren, außer den Ergebnissen 'CATS' oder 'DOGS', weil Sie versuchen, die gleiche Spalte auszuwählen, die Sie in die Bedingungsklausel setzen:

 select u.username from dba_users u inner join dba_profiles p on u.profile = p.profile where u.username = 'SYS'; USERNAME ----------------------------------------------- SYS SYS SYS SYS SYS SYS SYS SYS SYS SYS SYS SYS 

Daher wird das Ergebnis aus Ihrer Unterabfrage entweder "CATS" oder "DOGS" sein.

Also deine Frage sollte so etwas sein:

 SELECT c.id, c.email, cs.Source FROM contact c INNER JOIN contactsource__C cs ON cs.contactid__c = c.id WHERE cs.Source = 'DOGS' OR cs.Source='CATS';