2016-06-22 1 views
1

J'essaie d'obtenir une liste des ID de département sont présents dans un tableau, (PS_Y_FORM_HIRE), mais qui n'existent pas dans un autre tableau (PS_DEPARTMENT_VW).Comment puis-je sélectionner tous les ID présents dans une table, mais pas dans une autre

Voici les bases de ce que j'ai qui ne fonctionne pas:

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' 
); 

Je suis en train de former cette requête dans SQL Developer, mais il retourne juste une longue liste des blancs (après le filage/exécuter la requête depuis très longtemps). En outre, j'ai besoin que cette date soit effective, afin qu'elle ne saisisse que la ligne correcte datée, mais je ne savais pas comment et où l'incorporer dans la requête.

EDIT j'ai oublié de mentionner que seulement la table du département est efficace daté. La table de location de formulaire ne l'est pas. J'ai besoin d'obtenir la ligne actuellement datée de cette requête (pour m'assurer que les données sont exactes).

Notez également que DEPTID n'est pas une clé sur PS_Y_FORM_HIRE, mais sur PS_DEPARTMENT_VW. (Avec SETID_GL_DEPT et EFFDT).

Encore une fois, idéalement, j'aurai une liste de tous les identifiants de département qui apparaissent dans PS_Y_FORM_HIRE, mais qui ne sont pas dans PS_DEPARTMENT_VW.

+0

Le concept que vous recherchez est appelé "anti join" – FuzzyTree

Répondre

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

ou

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

ou

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

J'ai pris un peu de boulot après ça, mais cette réponse m'a beaucoup aidé sur mon chemin. –

1

Cela ressemble à un travail pour l'opération MINUS. Quelque chose comme

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

Vous n'avez pas fourni d'informations pour déterminer exactement ce que vous voulez faire avec les dates d'entrée en vigueur; adapter au besoin.

+0

Voir les informations éditées sur effdt dans mon article –

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

Votre question est un peu clair autour de la raison pour laquelle vous voulez que les lignes efficaces en date que vous n'êtes pas vérification de l'état efficace ou tout autre domaine cela peut avoir changé entre les lignes efficaces. Si votre question est, vous voulez connaître tous DEPTIDs à ​​PS_Y_FORM_HIRE qui n'existent pas ou sont inactifs à une date effective actuelle, le SQL ci-dessous devrait aider

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

Voir les informations éditées sur effdt dans mon article –

+0

Désolé, je ne trouve toujours pas clair pourquoi vous vous souciez de la ligne datée effective du PS_DEPARTMENT_VW car vous ne demandez pas de filtrer sur tout ce qui n'est pas une clé (SETID_GL_DEPT, DEPTID, EFFDT) Disons que le PS_DEPARTMENT_VW a deux lignes SETID_GL_DEPT, DEPTID, EFFDT --------------------------------- ------------ SETID, DEPT01, 1900-01-01 SETID, DEPT01, 2016-06-20 L'une ou l'autre ligne serait bien car tout ce qui vous intéresse est qu'il existe dans la table . Le seul cas que je puisse voir que vous vous inquiéteriez de EFFDT si vous ne filtrez pas sur une non-clé est les futures lignes EFFDT'd. – Darryls99