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

Posted

技术标签:

【中文标题】基于sql中的第三列返回两列的所有组合【英文标题】:Returning all combinations of two columns based on a third one in sql 【发布时间】:2017-10-19 12:14:59 【问题描述】:

我正在使用 Oracle SQL 数据库,试图根据第三列打印表中两列的所有可能组合。

进一步解释。我有一个包含三列的表:ID、attribute1 和attribute2。假设对于每个 ID,attribute1 可以等于 1、2、3 或 4,attribute2 也是如此。 ID 的每个属性可以有多个值。

目前,如果 ID=1 的属性 1 = 1,2 且属性 2 = 3, 4 且 ID=2 的属性 1 = 1,2,3 且属性 2 = 1, 4 它可能被列为

ID   attribute1    attribute2
1    1             3
1    2             4
2    1             1
2    2             1
2    3             4

我想要的是每个 ID 的属性 1 和属性 2 的所有组合,所以它看起来像这样:

ID   attribute1    attribute2
1    1             3
1    1             4
1    2             3
1    2             4
2    1             1
2    1             4
2    2             1
2    2             4
2    3             1
2    3             4 

【问题讨论】:

那么你现在还在Oracle 还是SQL Server 好吧,我对数据库很陌生,但我使用的是 Oracle SQL 开发人员,我认为这意味着它是一个 oracle 服务器,对吧? 是的,很可能,但您已将问题标记为“sql-server”,意思是“Microsoft SQL Server”。它应该被标记为“oracle”。 【参考方案1】:

此查询将返回每个 ID 的属性 1 和属性 2 之间的所有组合:

SELECT A1.ID, attribute1, attribute2
    FROM ( SELECT DISTINCT ID, Attribute1 FROM MyTable) A1
    INNER JOIN ( SELECT DISTINCT ID, Attribute2 FROM MyTable) A2 ON A1.ID = A2.ID

【讨论】:

感谢您的回答,但是当我运行此程序时,我收到错误“FROM 关键字未在预期的位置找到”,有什么想法吗? 我忘记在子查询中指定'FROM Table',现在我已经修改了。【参考方案2】:

应该这样做:

SELECT t1.id, t1.attribute1, t2.attribute2
FROM MyTable t1
JOIN MyTable t2
    ON  t1.id = t2.id
    AND t1.attribute1 = t2.attribute1
UNION ALL
SELECT t1.id, t1.attribute1, t2.attribute2
FROM MyTable t1
JOIN MyTable t2
    ON  t1.id = t2.id
    AND t1.attribute2 = t2.attribute2

如果您不想重复,请将UNION ALL 替换为UNION

我认为你也可以这样做,这可能会更好,但可能会表现得更差:

SELECT t1.id, t1.attribute1, t2.attribute2
FROM MyTable t1
JOIN MyTable t2
    ON  t1.id = t2.id
    AND (t1.attribute1 = t2.attribute1 OR t1.attribute2 = t2.attribute2)

【讨论】:

感谢您的回答,但这是否意味着我必须先创建第二个名为 t2 的表? @Tom Axelsson:t1 和 t2 是别名。表是相同的 - MyTable - 你应该用你的真实表名替换它。

以上是关于基于sql中的第三列返回两列的所有组合的主要内容,如果未能解决你的问题,请参考以下文章

比较两个excel的两列并返回第三列

在SQL中,如何将两列的数据相乘以获得第三列

SQL:包含 NULLS 的两列的总和?

Pandas:将依赖于第三列的相同数据框的两列相乘

SQL Server中的组合

Sql Server 查询,一共三列,怎样查出第一个列值相同,第二列值最大的第三列的值?