2011-12-20 15 views
3

以下のSQLを手伝ってもらえますか?SQL結合と出力形式

**Table A** 

Id Seq First_Name Last_Name 
1 1  John   Walter 
1 2  Michael  Jordan 
1 3  Sally   May 

私は私の出力がどこ特定のIDについては、以下のようなものを見てみたいが、各シーケンス番号のために、私が最初に名前や他のシーケンス番号の最後の名前を取得したいです。

出力例

Id Seq Name 
1 1  Michael Jordan | Sally May 
1 2  John Walter | Sally May 
1 3  John Walter | Michael Jordan 

SQLで任意のヘルプ?

+0

与えられたIDに対して常に正確に3つのシーケンスIDがありますか? –

+0

@Rene - いいえ、テーブルは任意の数のシーケンスを持つことができます! – jagamot

答えて

2

集計機能collect()を使用します。

ここにはOracle documentationへのリンクがあります。あなたのケースでは

、これは次のようになります。

create or replace type names_t as table of varchar2(50); 
/

create or replace function join_names(names names_t) 
        return varchar2 
as 
    ret varchar2(4000); 
begin 
    for i in 1 .. names.count loop 

     if i > 1 then 
     ret := ret || ','; 
     end if; 
     ret := ret || names(i); 

    end loop; 

    return ret; 
end join_names; 
/


create table tq84_table (
    id   number, 
    seq  number, 
    first_name varchar2(20), 
    last_name varchar2(20) 
); 

insert into tq84_table values (1, 1, 'John' , 'Walter'); 
insert into tq84_table values (1, 2, 'Michael', 'Jordan'); 
insert into tq84_table values (1, 3, 'Sally' , 'May' ); 


select 
    t1.id, 
    t1.seq, 
    join_names(
      cast(collect(t2.first_name || ' ' || t2.last_name order by t2.seq) 
       as names_t) 
) 
from 
    tq84_table t1, 
    tq84_table t2 
where 
    t1.id = t2.id and 
    t1.seq != t2.seq 
group by t1.id, t1.seq 

は、Oracle 11R2以上を使用している場合、あなたはまたを作成 を必要とせずにずっと簡単です LISTAGGを、(使用することができますタイプまたは機能):

クエリは、その後

select listagg(t2.first_name || ' ' || t2.last_name, ',') 
     within group (order by t2.seq) 
     over (partition by id) as names 
    from .... same as above ... 
なり
+1

LISTAGGは11.2で導入されました。それは11.1で利用できません。 –

+0

@a_horse_with_no_name:そうです。私は答えを編集しました。 –

-2

3列だけでなく、一般的に動作します。

DECLARE @Names VARCHAR(8000) 
SELECT @Names = COALESCE(@Names + ', ', '') + First_Name +' '+Last_Name FROM A 
WHERE Seq !=2 and Id IS NOT NULL 
select Id,Seq,@Names from A where Seq = 2 
print @Names 

レコードを取得するには、Seq値を渡す必要があります。 ありがとう、 Prema

+0

'@ variables'構文はOracleには不明です。 –

+0

@RenéNyffenegger - 私はSQl – prema

+0

でそれを語った。OracleはSQlについても知っているが、それでも '@ variables'構文だけでなく' coalesce() 'のためにもと述べた。したがって、OPがPL/SQL *と* Oracle *を特に要求した場合は、少なくとも一般的な*ではありません。マイクロソフトが自社の製品をSQL Server *と呼ぶのが好きだからといって、SQLのようなものがあるというわけではありません。 -1。 –

関連する問題