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

How to use wm_concat one a column that already exists in the query?

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

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

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_value:

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

Table_with_status:

|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 |

预期输出:

|CoID | active_CO_Status_for_same_ID_but_different_CusCODE  | ID | Value |
|--------|---------|----------|----|
|354223 | 666698,666700 | 1.432 | 0784296L | 99 |
|321232 | N/A | 4.212321.22 | 0432296L | 32 |
|938421 | N/A | 3.213 | 0021321L | 93 |

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

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

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

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';

根据您的描述和预期输出,您似乎需要左外连接,例如:

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.ID, 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