0

次の 2 つのテーブルを想像してください。

create table MainTable (
  MainId integer not null, -- This is the index
  Data varchar(100) not null
)

create table OtherTable (
  MainId integer not null,    -- MainId, Name combined are the index.
  Name varchar(100) not null,
  Status tinyint not null
)

からすべての行を選択し、それぞれにMainTable一致するすべての行を結果セットの 1 つのフィールドに結合します。MainIdOtherTable

次のデータを想像してください。

MainTable:
1, 'Hi'
2, 'What'

OtherTable:
1, 'Fish', 1
1, 'Horse', 0
2, 'Fish', 0

次のような結果セットが必要です。

MainId, Data,   Others
1,      'Hi',   'Fish=1,Horse=0'
2,      'What', 'Fish=0'

これを行う最もエレガントな方法は何ですか?

(コンマが結果の文字列の前または最後にあることを心配しないでください。)

4

2 に答える 2

1

Sybase でこれを行うための本当に洗練された方法はありません。ただし、1つの方法を次に示します。

select 
  mt.MainId, 
  mt.Data,
  Others = stuff((
             max(case when seqnum = 1 then ','+Name+'='+cast(status as varchar(255)) else '' end) +
             max(case when seqnum = 2 then ','+Name+'='+cast(status as varchar(255)) else '' end) +
             max(case when seqnum = 3 then ','+Name+'='+cast(status as varchar(255)) else '' end)
           ), 1, 1, '')
from MainTable mt 
  left outer join
    (select 
       ot.*, 
       row_number() over (partition by MainId order by status desc) as seqnum
     from OtherTable ot
    ) ot
    on mt.MainId = ot.MainId
group by
  mt.MainId, md.Data

つまり、2 番目のテーブルの値を列挙します。stuff()次に、関数を使用して余分なコンマを処理し、条件付き集計を実行して各値を取得します。上記は最初の 3 つの値に対して機能します。さらに必要な場合は、さらに句を追加する必要があります。

于 2013-08-19T14:49:08.510 に答える