我有一张包含所有数据的表格。我尝试过连接,子查询和联合,但没有一个能给我想要的结果。我正在运行Oracle 12g。
这是一个示例表:
FILENAME | VALUE | RAW
AA | XX | ZZ
AA | YY | WW
DD | GG | II
DD | HH | JJ
我使用的当前SQL语句是:
SELECT FILENAME, VALUE VALUE1 FROM TABLE WHERE FILENAME='AA';
SELECT FILENAME, VALUE VALUE2 FROM TABLE WHERE FILENAME='DD';
我得到以下结果:
FILENAME | VALUE1
AA | XX
AA | YY
和
FILENAME | VALUE2
DD | GG
DD | HH
但我需要结果:
FILENAME | VALUE1 | VALUE2
AA | XX | GG
AA | YY | HH
如果AA或DD在FILENAME中,则无关紧要。没有外键或唯一值我可以做一个简单的INNER JOIN。我无法在表中添加新列。我希望对我的数据进行排序,然后使用Oracle的ROWNUM作为临时列,然后我可以使用它来进行自我加入,但Oracle不会让我。
示例:
SELECT L.FILENAME, L.VALUE VALUE1, R.VALUE VALUE2
FROM TABLE L JOIN TABLE R
ON (L.ROWNUM=R.ROWNUM)
WHERE L.FILENAME IN ('AA','DD');
感谢任何帮助。
答案 0 :(得分:0)
你能这样试试吗?
SELECT T1.FILENAME, T1.VALUE VALUE1, T2.VALUE VALUE2
FROM
(SELECT FILENAME, VALUE, RAW, rownum RNUM FROM TABLE1 WHERE FILENAME = 'AA') T1,
(SELECT FILENAME, VALUE, RAW, rownum RNUM FROM TABLE1 WHERE FILENAME = 'DD') T2
WHERE T1.RNUM = T2.RNUM;
答案 1 :(得分:0)
使用row_number()
的一种方法可能如下。
with cte as(
select t.*, row_number() over(partition by FILENAME1 order by value1) as rn
from table1 t
)
select t1.FILENAME1, t1.value1 as value1, t2.value1 as value2
from cte t1
join cte t2
on t1.rn = t2.rn and t1.FILENAME1 = 'AA' and t2.FILENAME1 = 'DD'
以上操作是cte
row_number()
从1
分区FILENAME1
开始分配row_number()
,然后在主查询中,它将表连接到+-----------+--------+--------+
| FILENAME1 | VALUE1 | VALUE2 |
+-----------+--------+--------+
| AA | XX | GG |
| AA | YY | HH |
+-----------+--------+--------+
{1}}和其他各自的硬编码值。
<强>结果:强>
+
<强> DEMO 强>
答案 2 :(得分:0)
你可以试试这个:
select a1, a2, b2
from ( select row_number() over(order by filename) rn_a, filename a1, value a2 from mytable where filename = 'AA' ) inner join
( select row_number() over(order by filename) rn_b, value b2 from mytable filename = 'DD' ) on rn_a = rn_b
order by a2;
其中
ROW_NUMBER
是分析函数,在版本8iR2
中引入。它分配一个唯一的号码 到应用它的每一行(分区中的每一行) 或查询返回的每一行)。通过使用嵌套子查询 查询中的ROW_NUMBER
检索a的ROW_NUMBER
值 指定范围,您可以从中找到精确的行子集 内部查询的结果。