使用Select query Oracle检查表中是否存在值组合

时间:2018-01-18 20:48:47

标签: sql oracle select-query

我有下面的查询,它没有返回预期的输出结果。对于值为NAME的{​​{1}}列,它应检查'PL'表中包含M_LOGNAME列值组合的数据,并检查此组合值是否存在于E_ID表。如果它不存在,则查询应仅返回那些组合值。

目前,查询返回DIR_LOG表中已存在的所有组合值。我想我在某个地方缺少小条件是查询。

M_LOG

1 个答案:

答案 0 :(得分:1)

查询类似于“所有没有员工的部门”

解决此问题的常用方法是使用相关子查询。简单来说,使用示例模式scott,表,这是一个示例:

    SELECT
    d.deptno
FROM
    dept d
WHERE
    NOT EXISTS (
        SELECT
            1
        FROM
            emp e
        WHERE
            e.deptno = d.deptno
    );

而不是像这样的方法(与你的方法有些对应):

SELECT
    d.deptno
FROM
    dept d
    JOIN emp e ON d.deptno != e.deptno;

你需要采取这样的方法:

SELECT
    MAX(ml.name),
    ml.e_id,
    CASE   --If the day of the month is the 1st, 2nd or 3rd then it will use the last day of the previous month otherwise it will use the last day of the current month
            WHEN EXTRACT(DAY FROM SYSDATE) <= 3 THEN trunc(SYSDATE,'MM') - INTERVAL '1' DAY
            ELSE last_day(trunc(SYSDATE) )
        END,
    1,
    'M1'
FROM
    dir_log ml
WHERE
    1 = 1
    AND   ml.name = 'PL'
NOT EXISTS (
    SELECT
        1
    FROM
        m_log md
    WHERE
        ml.name = md.name
        AND   ml.e_id = md.e_id
)
GROUP BY
    ml.e_id,
    CASE
            WHEN EXTRACT(DAY FROM SYSDATE) <= 3 THEN trunc(SYSDATE,'MM') - INTERVAL '1' DAY
            ELSE last_day(trunc(SYSDATE) )
        END,
    1,
    'M1'
    ;

已修改分组依据以包括选择中的所有非聚合值。