如何选择一个表中但不存在于另一个表中的所有ID

时间:2016-06-22 22:51:31

标签: sql oracle peoplesoft

我想在一个表格中找到一个部门ID列表,(PS_Y_FORM_HIRE),但不存在于另一个表格中PS_DEPARTMENT_VW)。

以下是我的工作基础:

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中显示但不在PS_DEPARTMENT_VW中的所有部门ID。

4 个答案:

答案 0 :(得分: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
)

答案 1 :(得分:1)

这似乎是MINUS行动的一项工作。像

这样的东西
select deptid from ps_y_form_hire where eff_date = <whatever>
minus
select deptid from ps_department_vw <where eff_date = ...>

您没有提供信息来确定您希望在哪些方面完成有效日期;根据需要进行调整。

答案 2 :(得分: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')

答案 3 :(得分:0)

您的问题有点不明确,为什么您需要有效的日期行,因为您没有检查有效状态或有效行之间可能已更改的任何其他字段。如果您的问题是,您想知道PS_Y_FORM_HIRE中的所有DEPTID在当前生效日期之前不存在或处于非活动状态,那么下面的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)  
                )