使用 Select 查询 Oracle 检查 table 中存在的值组合
Check combination of values exist in table using Select query Oracle
我的以下查询不是 return 预期的输出结果。对于值='PL'
的 NAME
列,它应该使用 NAME
和 E_ID
列值组合检查 M_LOG
table 中的数据,并检查这是否DIR_LOG
table 中存在组合值。如果不存在,查询应该 return 只有那些组合值。
当前查询正在return查询M_LOG
table中已经存在的所有组合值。我想我在某处缺少小条件是查询。
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'
;
分组依据已修改为包括选择中的所有非聚合值。
我的以下查询不是 return 预期的输出结果。对于值='PL'
的 NAME
列,它应该使用 NAME
和 E_ID
列值组合检查 M_LOG
table 中的数据,并检查这是否DIR_LOG
table 中存在组合值。如果不存在,查询应该 return 只有那些组合值。
当前查询正在return查询M_LOG
table中已经存在的所有组合值。我想我在某处缺少小条件是查询。
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'
;
分组依据已修改为包括选择中的所有非聚合值。