我如何 select 一个 table 中存在但另一个中不存在的所有 id

How do I select all id's that are present in one table but not in another

我正在尝试获取一个 table、(PS_Y_FORM_HIRE)中存在的部门 ID 列表,但在另一个 table([=14)中不存在=]).

这是我所拥有但不起作用的基础知识:

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 中形成这个查询,但它只是 returns 一长串空白(在 spinning/running 查询很长时间之后)。

此外,我需要它有生效日期,以便它只抓取正确的生效日期行,但我不确定如何以及在何处将其合并到查询中。

编辑 我忘记提到 只有 部门 table 是有效日期。表格 hire table 不是。我需要从此查询中获取当前有效日期的行(以确保数据准确)。

另请注意,DEPTID 不是 PS_Y_FORM_HIRE 上的键,而是 PS_DEPARTMENT_VW 上的键。 (连同 SETID_GL_DEPTEFFDT)。

所以,再一次,理想情况下,我将列出出现在 PS_Y_FORM_HIRE 中但不在 PS_DEPARTMENT_VW 中的所有部门 ID。

这似乎是 MINUS 操作的工作。像

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

您没有提供信息来确定您到底想对生效日期做什么;根据需要进行调整。

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

你的问题有点不清楚为什么你想要有效的日期行,因为你没有检查有效状态或任何其他可能在有效行之间发生变化的字段。如果您的问题是,您想知道 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)  
                )