-1

次のように、正規化されたテーブル (テーブル a) と正規化されていないテーブル (テーブル b) があります。

ここに画像の説明を入力

基本的に、同じ学生 ID のテーブル a の各行について、同じ学生 ID を持つすべての親を読み取り、そのデータをテーブル B の 1 つの行に入れたいと考えています。

したがって、テーブル A に 3 つの行がある場合、テーブル B には 4 つの親フィールドのうち 3 つが入力された 1 つの行があります。

表 A のデータのサンプル

parentID studentID parentName
1         1         test
2         1          test1

私がテーブルBに望む結果

studentID parent1 parent2
1         test    test1
4

2 に答える 2

2

探しているフラットな結果を生成するクエリを次に示します。データを永続的に再構築する代わりに、これをビューにすることができなかった理由はありますか?

with RankedNormalizedFamily as (
  select
    ROW_NUMBER() over (PARTITION by studentid ORDER BY parentid) as rank
    ,parentID
    ,studentID
    ,parentName
  from
    NormalizedFamily
)
select
  studentID
  ,max(case when rank = 1 then parentName end) as parentName1
  ,max(case when rank = 2 then parentName end) as parentName2
  ,max(case when rank = 3 then parentName end) as parentName3
  ,max(case when rank = 4 then parentName end) as parentName4
from
  RankedNormalizedFamily f
group by
  studentID

デモ: http://www.sqlfiddle.com/#!3/91843/9

このデータをプッシュするにFlatFamilyは、次を使用しますINSERT...SELECT

insert into FlatFamily
select
  studentID
  ...
于 2012-07-25T16:57:47.000 に答える
1

したがって、使用しているデータベースのバージョンがわからなくても、システムで機能する可能性のある基本とサンプルクエリを紹介します。

基本的には「ピボットクエリ」の作成を検討していますが、クエリに対してこれを行うには、分析関数を使用して、テーブルAから返される各行の行番号を指定する必要があります。

select studentID,
       parentID
        row_number() over (partition by studentID order by studentID) as parentNum
FROM NormalizedFamily
order by studentID 

次に、その結​​果を使用して、ピボットクエリをまとめます。

select studentID, 
MAX(case when parentNum = 1 then parentID else null),
MAX(case when parentNum = 2 then parentID else null)
MAX(case when parentNum = 3 then parentID else null)
MAX(case when parentNum = 4 then parentID else null)
from (select studentID,
           parentID
            row_number() over (partition by studentID order by studentID) as parentNum
    FROM NormalizedFamily
    order by studentID)

データベースを操作するには構文をクリーンアップする必要があるかもしれませんが、それが一般的な要点です。

于 2012-07-25T17:00:44.490 に答える