微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 wm_concat 一个已存在于查询中的列?

如何解决如何使用 wm_concat 一个已存在于查询中的列?

所以...我目前正在使用 Oracle 11.1g,我需要创建一个查询,该查询使用来自 Table_with_value 的 ID 和 CusCODE,并使用 ID 检查 Table_with_status 以查找活动的 CO_status 但在不同的 CusCODE 上。

到目前为止,这是我所拥有的 - 除非手动提供 CusCODE 和 ID,否则显然无法正常工作:

update `yuk`.`sefer_yuk` 
set `bosaltma_tarihi`='21/06/2021' 
where `sefer_id`=1000569 
  AND `bosaltma_tarihi`='27/05/2021';

Table_with_value:

SELECT wm_concat(CoID) as active_CO_Status_for_same_ID_but_different_CusCODE
FROM Table_with_status
WHERE 
CoID IN (SELECT CoID FROM Table_with_status WHERE ID = Table_with_value.ID AND CusCODE != Table_with_value.CusCODE)) AND Co_status = 'active';

Table_with_status:

|CoID | CusCODE | ID | Value |
|--------|---------|----------|----|
|354223 | 1.432 | 0784296L | 99 |
|321232 | 4.212321.22 | 0432296L | 32 |
|938421 | 3.213 | 0021321L | 93 |

预期输出

|CoID | CusCODE | ID | Co_status|
|--------|--------------|----------|--------|
|354223 | 1.432 | 0784296L | active|
|354232 | 1.432 | 0784296L | inactive |
|666698 | 1.47621 | 0784296L | active |
|666700 | 1.5217 | 0784296L | active |
|938421 | 3.213 | 0021321L | active |
|938422 | 3.213 | 0021321L | active |
|938423 | 3.213 | 0021321L | active |
|321232 | 4.212321.22 | 0432296L | active |
|321232 | 4.212321.22 | 0432296L | active |
|321232 | 1.689 | 0432296L | inactive |

关于如何在没有任何 PL/sql for 循环的情况下理想地实现这一点的任何想法,但它也应该没问题,因为预计输出数据集

我提前为我提出问题的神秘性质道歉:) 如果有什么不清楚的地方,请告诉我。

解决方法

从您的描述和预期输出来看,您似乎需要一个左外连接,例如:

SELECT v.CoID,wm_concat(s.CoID) as other_active_CusCODE -- active_CO_Status_for_same_ID_but_different_CusCODE
  v.CusCODE,v.ID,v.value
FROM Table_with_value v
LEFT JOIN Table_with_status s
ON s.ID = v.ID
AND s.CusCODE != v.CusCODE
AND s.Co_status = 'active'
GROUP BY v.CoID,v.CusCODE,v.value;

SQL Fiddle 使用 listagg() 而不是从不支持和现在删除的 wm_concat();如果逻辑不是我所解释的那样,可以使用几种不同的方法。使用您的样本数据,他们都会得到:

COID   OTHER_ACTIVE_CUSCODE CUSCODE     ID       VALUE
------ -------------------- ----------- -------- -----
321232 (null)               4.212321.22 0432296L    32
354223 666698,666700        1.432       0784296L    99
938421 (null)               3.213       0021321L    93
,

假设您指的是正确的表格,您的代码看起来应该可以正常工作:

SELECT wm_concat(s.CoID) as active_CO_Status_for_same_ID_but_different_CusCODE
FROM Table_with_status s
WHERE s.CoID IN (SELECT v.CoID
                 FROM Table_with_value v
                 WHERE v.ID = s.ID AND
                       v.CusCODE <> s.CusCODE
                ) AND
      s.Co_status = 'active';

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。