0

次のようなempテーブルがあります

empnum deptno salary
----- ------ ------
1      null    null
null   2       null
null   null    null
null   null    3
5      null    4
null   6       1  

結果セットが次のようになるようにしたい

result
------
1
2
0
3
5
4
6
1

ある場合 はを3 nulls表示し0、他の 2 つの値を挿入されたのと同じ順序で表示する 必要があります。「2 つの null」がある場合は、結果セットに 1 つの値を表示する必要があります。
only one null

私が試してみました

select rs from  
((select decode(empno||deptno||sal,null,0,substr(empno||deptno||sal,1,1)as rs,rowid as ri from emp)
union  
((select decode(empno||deptno||sal,null,0,substr(empno||deptno||sal,2,1)as rs,rowid as ri from emp)  
minus  
(select decode(empno||deptno||sal,null,0,substr(empno||deptno||sal,1,1)as rs,rowid as ri from emp)))  
where rs is not null  
order by ri,rs;

上記のクエリは結果を次のように返します

rs
--
1
2
0
3
4
5
1
6

上記のように正確な結果セットを取得するのを手伝ってくれる人はいますか。

前もって感謝します..

4

1 に答える 1

1

この答えは、テーブルの作成方法に大きく依存しています。ROWDEPENDENCIES を使用して作成する必要があり、順序が維持されるように、各挿入後に COMMIT が必要です。

これは、実際のデータでは役に立たない可能性があります。レコードの挿入時刻のタイム スタンプをテーブルに保存しなかった場合、列の順序を決定する方法はありません。

サンプル テーブルとデータを使用:

create table emp
(empnum int, deptno int, salary int) ROWDEPENDENCIES;
insert into emp (empnum, deptno, salary) values
(1,      null,    null); 
commit;
insert into emp (empnum, deptno, salary) values
(null,   2,       null);
commit;
insert into emp (empnum, deptno, salary) values
(null,   null  ,  null); 
commit;
insert into emp (empnum, deptno, salary) values
(null ,  null ,   3); 
commit;
insert into emp (empnum, deptno, salary) values
(5     , null,    4);
commit;
insert into emp (empnum, deptno, salary) values
(null   ,6 ,      1  ); 
commit;

create table emp2
(empnum int, deptno int, salary int, rowscn int) ROWDEPENDENCIES;
insert into emp2
select empnum, deptno, salary, ora_rowscn from emp;

次に、ORA_ROWSCN疑似列を使用して挿入日を決定できます。

with countqry as
(select empnum, deptno, salary, 
        rowscn,
        decode(empnum, null, 0, 1) e,
        decode(deptno, null, 0, 1) d,
        decode(salary, null, 0, 1) s    
from emp2)
select 0 as val, rowscn 
from countqry where e+d+s = 0
union  all
select coalesce(empnum, deptno, salary) as val, 
       rowscn
from countqry where e+d+s = 1
union all 
select val, rowscn from
(
select * from 
  (select empnum, deptno, salary, rowscn 
    from countqry where e+d+s >= 2)
unpivot (val for x in (empnum as '1', deptno as '2', salary as '3'))
order by rowscn, val
)
order by rowscn

これは SQLFiddle での実際の例です。

于 2012-06-26T18:29:56.300 に答える