oracle中表的3列的所有可能组合

Posted

技术标签:

【中文标题】oracle中表的3列的所有可能组合【英文标题】:All possible combinations from 3 columns of a table in oracle 【发布时间】:2021-09-06 13:04:20 【问题描述】:

我正在寻找某种示例或想法,如何从 oracle 中的数据库表的 3 列创建所有可能的组合。

我有下表中的数据-

Name ID CODE POS_4 POS_5 POS_6
XJ   21 SAJ     A   
XJ   21 SAJ         A   
XJ   21 SAJ         C   
XJ   21 SAJ         J   
XJ   21 SAJ         L   
XJ   21 SAJ               10
XJ   21 SAJ               12
XJ   21 SAJ               14

我期待的结果如下-

A_A_10
A_A_12
A_A_14
A_C_10
A_C_12
A_C_14
and so on...

任何帮助将不胜感激。

【问题讨论】:

所有组合,无论NameID 还是CODE?还是仅在 same NameIDCODE 中的组合? 【参考方案1】:

你可以使用cross join:

select p4.pos_4 || '_' || p5.pos_5 || '_' || p6.pos_6
from (select distinct pos_4 from t) p4 cross join
     (select distinct pos_5 from t) p5 cross join
     (select distinct pos_6 from t) p6;

如果要消除 NULL 值,则包括:

where p4.pos_4 is not null and p5.pos_5 is not null and p6.pos_6 is not null
     

【讨论】:

【参考方案2】:

您可以使用加入。即:

select Pos_4, Pos_5, Pos_6
from 
(select Pos_4 from myTable where Pos_4 is not null) T1
cross join (select Pos_5 from myTable where Pos_5 is not null) T2
cross join (select Pos_6 from myTable where Pos_6 is not null) T3;

【讨论】:

非常感谢您的解决方案,它奏效了。但是,有时我对任何列(POS_4/POS_5/POS_6)都有一些空行,并且使用 Pos_4 不为空/Pos_5 不为空/Pos_6 不为空 如果其中任何一个为完全空,则不会给出任何结果。示例-Name ID CODE POS_4 POS_5 POS_6XJ 21 SAJ J XJ 21 SAJ L XJ 21 SAJ 10XJ 21 SAJ 12XJ 21 SAJ 14 在上表中假设 POS_6 完全为空。对于任何其他 ID,它可能是 POS_4/POS_5。任何避免这种情况的建议。 @Jai,很抱歉我无法理解您需要的问题和输出。您会编辑您的问题以显示它吗?

以上是关于oracle中表的3列的所有可能组合的主要内容,如果未能解决你的问题,请参考以下文章

表中列的唯一值组合

基于sql中的第三列返回两列的所有组合

tidyverse:Chi Square适用于所有列的组合

根据另一列 SQL 动态生成一列的数据组合

二维数组中长度为 8 的所有可能组合

Oracle:将两个具有不同列的表组合在一起