我需要在 Oracle SQL 中构建一个查询,以便它应该获取仅包含 null ornnn_id 的记录

问题描述 投票:0回答:2

根据此数据:

ornnn_id   ind_id   effect_from_dat
3574953     null    null
3574953     null    null
3574953     null    null    
3574953     null    null    
3574953     null    null
3574953     null    null
3574953     null    null
3574953     1       08-AUG-2003 10.20.10
3574953     1       08-AUG-2003 10.20.10
3574953     1       08-AUG-2003 10.20.10
3574953     1       08-AUG-2003 10.20.10
3574953     1       08-AUG-2003 10.20.10
12345      null     null
12345      null     null
1212       3        08-AUG-2003 10.20.10
1212       3        08-AUG-2003 10.20.10

我需要查询,以便仅获取具有 null

ind_id
effect_from_dat
的记录,例如具有
ornnn_id
12345

的行

我的询问

select ornnn_id, ind_id,sl_effect_from_dat from table where sl_ind is null and sl_effect_from_dat is null

正在获取

ornnn_id
3574953 和 12345 - 但我只想要 12345。

enter image description here

sql oracle
2个回答
0
投票

您可以使用分析

COUNT
函数并查找两者中的零计数(因为
COUNT(column_name)
不计算
NULL
值)

SELECT ornnn_id,
       ind_id,
       sl_effect_from_dat
FROM   (
  SELECT ornnn_id,
         ind_id,
         sl_effect_from_dat,
         COUNT(ind_id) OVER (PARTITION BY ornnn_id) AS num_ind_id,
         COUNT(sl_effect_from_dat) OVER (PARTITION BY ornnn_id) AS num_sl_effect_from_dat
  FROM   table_name
)
WHERE  num_ind_id = 0
AND    num_sl_effect_from_dat = 0;

对于样本数据:

CREATE TABLE table_name (ornnn_id, ind_id, sl_effect_from_dat) AS
SELECT 3574953, NULL, NULL FROM DUAL UNION ALL
SELECT 3574953, NULL, NULL FROM DUAL UNION ALL
SELECT 3574953, NULL, NULL FROM DUAL UNION ALL
SELECT 3574953, NULL, NULL FROM DUAL UNION ALL
SELECT 3574953, NULL, NULL FROM DUAL UNION ALL
SELECT 3574953, NULL, NULL FROM DUAL UNION ALL
SELECT 3574953, NULL, NULL FROM DUAL UNION ALL
SELECT 3574953, 1, DATE '2023-08-08' + INTERVAL '10:20:10' HOUR TO SECOND FROM DUAL UNION ALL
SELECT 3574953, 1, DATE '2023-08-08' + INTERVAL '10:20:10' HOUR TO SECOND FROM DUAL UNION ALL
SELECT 3574953, 1, DATE '2023-08-08' + INTERVAL '10:20:10' HOUR TO SECOND FROM DUAL UNION ALL
SELECT 3574953, 1, DATE '2023-08-08' + INTERVAL '10:20:10' HOUR TO SECOND FROM DUAL UNION ALL
SELECT 3574953, 1, DATE '2023-08-08' + INTERVAL '10:20:10' HOUR TO SECOND FROM DUAL UNION ALL
SELECT 12345, NULL, NULL FROM DUAL UNION ALL
SELECT 12345, NULL, NULL FROM DUAL UNION ALL
SELECT 1212, 3, DATE '2023-08-08' + INTERVAL '10:20:10' HOUR TO SECOND FROM DUAL UNION ALL
SELECT 1212, 3, DATE '2023-08-08' + INTERVAL '10:20:10' HOUR TO SECOND FROM DUAL;

输出:

ORNNN_ID IND_ID SL_EFFECT_FROM_DAT
12345
12345

小提琴


0
投票

有几种方法可以做到这一点,具体取决于您想要的输出;这里有几个:

select ornnn_id
from your_table
group by ornnn_id
having max(ind_id) is null
and max(effect_from_dat) is null
ORNNN_ID
12345

这只是获取唯一的 ID - 其他列似乎毫无意义,因为您知道它们是空的。

或者,如果您不只想要唯一的 ID,则可以获取所有行:

select ornnn_id, ind_id, effect_from_dat
from your_table t1
where ind_id is null
and effect_from_dat is null
and not exists (
  select null
  from your_table t2
  where t2.ornnn_id = t1.ornnn_id
  and (t2.ind_id is not null or t2.effect_from_dat is not null)
)
ORNNN_ID IND_ID EFFECT_FROM_DAT
12345
12345

小提琴

还有其他的,比如MT0的分析计数。这取决于您实际想要什么,以及各种方法如何处理您的数据。

© www.soinside.com 2019 - 2024. All rights reserved.