1

acc_id という列に基づいて 2 つのテーブル (Account、Address) を結合しています

Address テーブルには、acc_id に関連付けられた複数のアドレスが含まれる場合があり、アドレスがプライマリ アドレスかセカンダリ アドレスかを示す type 列で区別されます。

acc_id で 2 つのテーブルを結合したいのですが、結果の Address テーブルの列は次のようになります。

  • アドレスがない場合は null
  • 1 つのアドレスが存在する場合、そのアドレスの列
  • 2 つのアドレスが存在する場合、プライマリ アドレスの列

(Teradata-)SQL でこれを行う方法は?

4

2 に答える 2

2

ケースステートメントはあなたのために働くことができます!

  • 「住所」テーブルで左結合を 2 回実行します。
  • 参加条件の 1 つは「プライマリ」アドレス用である必要があります
  • もう 1 つはセカンダリ アドレス用です。
  • case ステートメントは、最初にプライマリ アドレスをチェックします。
  • 存在しない場合
  • 次に、セカンダリ アドレスを選択します。
  • left outer joinどちらも存在しない場合はaが使用されているため、値は次のように表示されますNULL
      SELECT DISTINCT a.acc_id
           、primary_add.acc_id が NULL でない場合
                  THEN primary_add.address
                  ELSE secondary_add.address
             END アドレス
           、primary_add.acc_id が NULL でない場合
                  THEN primary_add.city
                  ELSE secondary_add.city
             終わりの都市
           、primary_add.acc_id が NULL でない場合
                  THEN primary_add.state
                  ELSE secondary_add.state
             終了状態
           、primary_add.acc_id が NULL でない場合
                  THEN primary_add.zip
                  ELSE secondary_add.zip
             エンドジップ
           、primary_add.acc_id が NULL でない場合
                  THEN primary_add.address_type
                  ELSE secondary_add.address_type
             END address_type
          ------------------------------------------------
         FROM アカウントとして
          ------------------------------------------------
         LEFT OUTER JOIN アドレス AS primary_add
           ON a.acc_id = primary_add.acc_id
              AND address_type = 'プライマリ'
          ------------------------------------------------
         LEFT OUTER JOIN アドレス AS secondary_add
           ON a.acc_id = secondary_add.acc_id
              AND address_type = 'セカンダリ'
于 2013-05-23T13:22:56.427 に答える
2

これは、はるかに単純な Teradata ソリューションです。

SELECT   a.acc_id
       , b.*
FROM     account a
LEFT JOIN address b
ON      b.acc_id=a.acc_id
QUALIFY ROW_NUMBER() OVER (PARTITION BY a.acc_id
                           ORDER BY     b.address_type) = 1

QUALIFYは Teradata の拡張機能であり、このような場合に非常に便利です。パーティションはPARTITIONBY 句を使用して構築され、ORDER BY句によって並べ替えられます。次にQUALIFY、関数を使用して各パーティションの最初の行を保持しROW_NUMBERます。

もちろん、address_type列には、必要に応じて並べ替えられる値があると想定しています。値が実際に "Primary" と "Secondary" である場合、示されているように昇順で並べ替えることができます (両方の値が存在する場合は "Primary" を選択します)。必要に応じて、句でCASE式を使用することもできます。ORDER BY

また、アドレステーブルに必要な列に明示的に名前を付けることを強くお勧めします。アドレスがない場合に「ヌル」が必要であるというあなたのコメントは、LEFT JOIN.

于 2013-05-24T19:58:07.697 に答える