2016-06-22 16 views
1

Ich versuche, eine Liste der Abteilung IDs in einer Tabelle (PS_Y_FORM_HIRE), aber die nicht in einer anderen Tabelle (PS_DEPARTMENT_VW). HierWie wähle ich alle IDs, die in einer Tabelle vorhanden sind, aber nicht in einem anderen

sind die Grundlagen das, was ich habe, das nicht funktioniert:

SELECT h.DEPTID FROM PS_Y_FORM_HIRE h, PS_DEPARTMENT_VW d WHERE NOT EXISTS (
    SELECT d1.DEPTID FROM PS_DEPARTMENT_VW d1 WHERE d1.DEPTID = h.DEPTID 
     and d1.SETID_GL_DEPT = 'IDBYU' 
); 

Ich versuche, diese Abfrage in SQL Developer zu bilden, aber es gibt nur eine lange Liste von Rohlingen (nach dem Spinnen/die Abfrage für eine sehr lange Zeit ausführen).

Darüber hinaus brauche ich dies effektiv datiert, so dass es nur die richtige effektive datierte Zeile ergreift, aber ich war mir nicht sicher, wie und wo dies in die Abfrage zu integrieren.

EDIT ich vernachlässigt zu erwähnen, dass nur die Abteilungstabelle wirksam datiert ist. Der Formularverleihtisch ist nicht. Ich muss die aktuelle Zeile aus dieser Abfrage erhalten (um sicherzustellen, dass die Daten korrekt sind).

Beachten Sie auch, dass DEPTID kein Schlüssel auf PS_Y_FORM_HIRE ist, aber auf PS_DEPARTMENT_VW. (Zusammen mit SETID_GL_DEPT und EFFDT).

Also wieder, idealerweise, ich werde eine Liste aller Abteilung IDs, die in PS_Y_FORM_HIRE erscheinen, aber die nicht in PS_DEPARTMENT_VW sind.

+0

Das Konzept helfen Sie suchen heißt "anti join" – FuzzyTree

Antwort

3
SELECT DEPTID 
FROM PS_Y_FORM_HIRE 
MINUS 
SELECT DEPTID 
FROM PS_DEPARTMENT_VW 
WHERE SETID_GL_DEPT = 'IDBYU'; 

oder

SELECT DEPTID 
FROM PS_Y_FORM_HIRE 
WHERE DEPTID NOT IN (
    SELECT DEPTID 
    FROM PS_DEPARTMENT_VW 
    WHERE SETID_GL_DEPT = 'IDBYU' 
) 

oder

SELECT DEPTID 
FROM PS_Y_FORM_HIRE h 
WHERE NOT EXISTS (
    SELECT 1 
    FROM PS_DEPARTMENT_VW d 
    WHERE SETID_GL_DEPT = 'IDBYU' 
    AND d.DEPTID = h.DEPTID 
) 
+0

Nahm ein wenig Arbeit, aber diese Antwort half mir auf meinem Weg am meisten. –

1

Dies scheint ein Job für die MINUS-Operation. Etwas wie

select deptid from ps_y_form_hire where eff_date = <whatever> 
minus 
select deptid from ps_department_vw <where eff_date = ...> 

Sie haben keine Informationen zur Verfügung gestellt, um festzustellen, was genau Sie mit den effektiven Daten getan werden möchten; bei Bedarf anpassen.

+0

Siehe bearbeitete Informationen über effdt in meinem Beitrag –

1
SELECT h.DEPTID 
    FROM PS_Y_FORM_HIRE h 
WHERE h.DEPTID NOT IN (SELECT p.DEPTID 
          FROM PS_DEPARTMENT_VW p 
         WHERE p.SETID_GL_DEPT = 'IDBYU') 
0

Ihre Frage um ein wenig unklar ist, warum Sie effektiv datierten Zeilen möchten, wie Sie sind nicht wirksam Status oder andere Feldprüfung das kann zwischen effektiven Zeilen geändert haben. Wenn Ihre Frage ist, wollen Sie alle DEPTIDs in PS_Y_FORM_HIRE kennen, die entweder gar nicht oder als eines aktuellen Zeitpunkt des Inkrafttretens inaktiv sind vorhanden, dann unter der SQL sollte

SELECT DEPTID 
FROM PS_Y_FORM_HIRE h 
WHERE 
H.DEPTID NOT IN (SELECT d.DEPTID 
        FROM PS_DEPARTMENT_VW d 
        WHERE d.EFF_STATUS = 'A' 
        AND d.EFFDT = (SELECT MAX(EFFDT) 
           FROM PS_DEPARTMENT_VW d2 
           WHERE d2.SETID_GL_DEPT = d.SETID_GL_DEPT 
           AND d2.DEPTID = d.DEPTID 
           AND d2.EFFDT <= CURRENT_DATE) 
       ) 
+0

Siehe bearbeitete Informationen über effdt in meinem Beitrag –

+0

Sorry, ich finde es immer noch nicht klar, warum Sie sich für die effektive datierte Zeile des PS_DEPARTMENT_VW interessieren, da Sie nicht nach etwas filtern wollen, das kein Schlüssel ist (SETID_GL_DEPT, DEPTID, EFFDT) Nehmen wir an, das PS_DEPARTMENT_VW hat zwei Zeilen SETID_GL_DEPT, DEPTID, EFFDT --------------------------------- ------------ SETID, DEPT01, 1900-01-01 SETID, DEPT01, 2016-06-20 Jede Zeile wäre in Ordnung, da Sie nur darauf achten, dass es in der Tabelle vorhanden ist . Der einzige Fall, den ich sehen kann, dass Sie sich Sorgen über EFFDT machen würden, wenn Sie nicht auf einen Nicht-Schlüssel filtern, sind zukünftige EFFDT-Reihen. – Darryls99