基于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中的第三列返回两列的所有组合的主要内容,如果未能解决你的问题,请参考以下文章