如何获得表的排列?

Posted

技术标签:

【中文标题】如何获得表的排列?【英文标题】:How to get permutation of a table? 【发布时间】:2020-05-18 11:41:20 【问题描述】:

我有一张有 10 列的表。我想得到所有可能的排列。具有 3 列的表的示例:

col1   col2   col3  
10       40     3,   
20        6     1,

排列表将是:

col1   col2   col3 
10      40      3,   
10      40      1,
10      6       3, 
10      6       1, 
20      6       1,
20      6       3,
20      40      3,
20      40      1,

我尝试使用 CROSS JOIN 来实现,但没有成功。 最好的方法是什么?

谢谢!

【问题讨论】:

如果某些列中有重复项,您要区分它们吗?即在显示的数据中 - 如果两条记录的 col3=3,最终结果是否必须包含 4 条或 8 条记录? 是的,我希望结果是独一无二的。如果在显示的数据中 col3=3 对于两条记录,最终结果将是 4 条记录。感谢您的快速回复:) 如果是这样,那么Gordon Linoff 可以解决您的任务。测试它并标记为解决方案。 【参考方案1】:

您可以使用cross join

select c1.col1, c2.col2, c3.col3
from (select distinct col1 from t) c1 cross join
     (select distinct col2 from t) c2 cross join
     (select distinct col3 from t) c3
order by c1.col1, c2.col2, c3.col3;

Here 是一个 dbfiddle。

【讨论】:

感谢戈登·林诺夫的帮助。我有一个问题- write: SELECT DISTINCT c1.col1, c2.col2, c3.col3 FROM c1 cross join c2 cross join c3 ORDER BY c1.col1, c2.col2, c3.col3 之间有什么区别;给你回答? (它们都有相同的输出)。谢谢你:) @s.r 。 . .这也有效。事实上,对于您的示例数据,您不需要distinct。但是,如果您在任何列中有重复值,您的版本会做更多的工作 - 生成比需要更多的行,然后删除重复项。

以上是关于如何获得表的排列?的主要内容,如果未能解决你的问题,请参考以下文章

Python:如何获得子集排列的列表?

如何在没有顺序重复的情况下获得 PHP 中的所有排列?

BigQuery:按开始日期和结束日期描述的用户元数据 - 创建跨多个表的排列

我们如何通过重新排列字符串中的字符来获得最大数量的回文子串?

随机排列单链表的前 N ​​个元素

如何密集排列数据集