2017-10-19 121 views
0

我正在使用一个Oracle SQL数据库尝试打印基于第三列的表中两列的所有可能的组合。基于第三个返回两列的所有组合基于第三个sql

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

目前,如果ID = 1具有ATTRIBUTE1 = 1,2和attribute2 = 3,4和ID = 2已经ATTRIBUTE1 = 1,2,3和attribute2 = 1,4它可能被列为

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

我想是每个ID ATTRIBUTE1和attribute2的所有组合所以它看起来像这样:

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

那么你现在还在'Oracle'或者它是否是'SQL Server'? – Squirrel

+0

嗯,我对数据库相当陌生,但我使用Oracle SQL开发人员,我认为这意味着它是一个Oracle服务器,对吧? –

+0

是的,很可能,但您已经标记了“sql-server”这个问题,意思是“Microsoft SQL Server”。它应该被标记为“oracle”。 –

回答

1

这个查询将返回属性1 attribute2之间的所有组合的每个ID:

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

感谢您的答案,但是当我运行这个时,我得到了错误“从关键字找不到预期的地方”,任何想法? –

+0

我忘了在子查询中指定'FROM Table',现在我修改了它。 –

0

像这样的东西应该这样做:

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

我认为你可以这样来做,也可能是更好的,但可能表现更差:

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) 
+0

感谢您的答案,但这是否意味着我必须创建第二个名为t2第一个表? –

+1

@Tom Axelsson:t1和t2是别名。表是一样的 - MyTable - 你应该用你的真实表名替换。 –

相关问题