2016-06-22 55 views
1

我想要獲得一個表中存在的部門ID列表(PS_Y_FORM_HIRE),但不存在於另一個表中(PS_DEPARTMENT_VW )。如何選擇所有在一個表中存在但沒有在另一個表中的ID

這裏是什麼我有一個不能正常工作的基本知識:

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

我試圖形成SQL Developer的這個查詢,但它只是返回空白一長串(後紡/長時間運行查詢)。另外,我需要這樣做才能生效,因此它只抓取正確的有效日期行,但我不確定如何以及在何處將其納入查詢。

編輯我忽略提及只有部門表生效日期。表格租用表不是。我需要從查詢中獲取當前有效日期行(以確保數據是準確的)。

另請注意,DEPTID不是PS_Y_FORM_HIRE上的關鍵字,而是PS_DEPARTMENT_VW上的關鍵字。 (連同SETID_GL_DEPTEFFDT)。

所以,理想情況下,我將列出出現在PS_Y_FORM_HIRE中的所有部門ID,但不在PS_DEPARTMENT_VW中。

+0

你正在尋找被稱爲概念「anti join」 – FuzzyTree

回答

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

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

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

過去了一些工作,但是這個答案幫了我最多的忙。 –

1

這看起來像是MINUS操作的工作。類似於

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

您沒有提供信息以確定您要完成的生效日期;根據需要調整。

+0

在我的文章中查看關於effdt的編輯信息 –

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

你的問題是圍繞你爲什麼要有效日期的行有點不清楚,你不檢查有效狀態或任何其他領域可能在有效行之間發生了變化。如果你的問題是,你要知道在PS_Y_FORM_HIRE所有DEPTIDs,要麼不存在或不活動作爲當前生效之日起,然後在下面的SQL應該幫助

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

在我的文章中查看關於effdt的編輯信息 –

+0

對不起,我仍然沒有找到它清楚你爲什麼關心PS_DEPARTMENT_VW的有效日期行,因爲你並沒有要求過濾任何不是關鍵的東西(SETID_GL_DEPT,DEPTID,EFFDT ) 可以說PS_DEPARTMENT_VW有兩行 SETID_GL_DEPT,DEPTID,EFFDT --------------------------------- ------------ SETID,DEPT01,1900-01-01 SETID,DEPT01,2016-06-20 任何一行都可以,因爲你所關心的只是它存在於表中。唯一的情況是,我可以看到,如果您未對非密鑰進行過濾,您會擔心EFFDT是未來的EFFDT行。 – Darryls99

相關問題