使用 Select 查询 Oracle 检查 table 中存在的值组合

Check combination of values exist in table using Select query Oracle

我的以下查询不是 return 预期的输出结果。对于值='PL'NAME 列,它应该使用 NAMEE_ID 列值组合检查 M_LOG table 中的数据,并检查这是否DIR_LOG table 中存在组合值。如果不存在,查询应该 return 只有那些组合值。

当前查询正在return查询M_LOGtable中已经存在的所有组合值。我想我在某处缺少小条件是查询。

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, M_LOG MD
WHERE ML.NAME != MD.NAME and ML.E_ID != MD.E_ID and
ML.NAME = 'PL' 
GROUP BY ML.E_ID

查询类似于"all depts not having employees"

解决此问题的常用方法是使用相关子查询。简单来说,使用示例架构 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'
    ;

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