Oracle

时间:2017-12-07 06:17:18

标签: sql oracle

我有一张包含所有数据的表格。我尝试过连接,子查询和联合,但没有一个能给我想要的结果。我正在运行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');

感谢任何帮助。

3 个答案:

答案 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值   指定范围,您可以从中找到精确的行子集   内部查询的结果。