【问题标题】:How do I select all id's that are present in one table but not in another如何选择一个表中存在但另一个表中没有的所有 id
【发布时间】:2016-06-22 22:51:30
【问题描述】:

我正在尝试获取一个表中存在的部门 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。

【问题讨论】:

  • 你要找的概念叫“反连接”

标签: sql oracle peoplesoft


【解决方案1】:
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
)

【讨论】:

  • 过去做了一些工作,但这个答案对我的帮助最大。
【解决方案2】:

这似乎是 MINUS 操作的工作。类似的东西

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

您没有提供信息来确定您希望在生效日期内具体做什么;根据需要进行调整。

【讨论】:

    【解决方案3】:
    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')
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 对不起,我仍然不清楚为什么您关心 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 行。
      猜你喜欢
      • 1970-01-01
      • 2011-02-10
      • 2022-11-13
      • 1970-01-01
      • 2018-03-20
      • 2016-02-29
      相关资源
      最近更新 更多