2011-12-26 10 views
2

私は階層型XMLデータ構造を記述する14のテーブルを持っています。 1つのフィールドは行のキーであり、別のフィールドはその親の外部キーです。残りの60フィールドは各テーブルで同じです。SQL left outer join - 列の代わりに行と同じ名前のフィールド

私は、列を水平に追加するのではなく、行の大きなシリアルリストを1つ取得したいと考えています。

たとえば、次のように設定して6列にします。どうすれば3列以上の行にシリアル化できますか?

SELECT ICN2.ICNID, ICN2.ICNTITLE, ICN2.PANE, ICN3.ICNID AS ICNID2, 
    ICN3.ICNTITLE AS ICNTITLE2, ICN3.PANE AS PANE2 
FROM ICN2 
LEFT OUTER JOIN ICN3 ON ICN2.ICN2_PKEY = ICN3.ICN2_FKEY 
WHERE ICN2.ICNID = N'65587' 

答えて

1

次いで条件を適用し、単一の(エイリアス)結果セットを作成するSQL UNIONを使用:

SELECT * FROM (
    SELECT ICNID, ICNTITLE, PANE 
    FROM ICN2 
    UNION ALL 
    SELECT ICNID, ICNTITLE, PANE 
    FROM ICN3 
    UNION ALL 
    SELECT ICNID, ICNTITLE, PANE 
    FROM ICN4 
    ...) A 
WHERE ICNID = N'65587' 

これはMySQLとPostgresのための構文であるが、正確な構文は、に応じて変えることができますどのデータベースを使用していますか。

あなたは、各行に定数を追加し、行がどこから来たテーブルを知っておく必要がある場合:

SELECT * FROM (
    SELECT 'ICN2' as SOURCE, ICNID, ICNTITLE, PANE 
    FROM ICN2 
    UNION ALL 
    SELECT 'ICN3', ICNID, ICNTITLE, PANE 
    FROM ICN3 
    UNION ALL 
    ...) A 
WHERE ICNID = N'65587' 

ところでUNION ALLが発注し、重複する行を保持します。 Plain UNIONは重複した行をソートして削除します。今まであなたに最高の

+0

おかげスーツた選んだ - 。。私は、SELECT ICN3 *、ICN2 * ICN3 RIGHT OUTER FROMがICN3.ICN2_FKEY = ICN2 ON ICN2を登録しよ参加RIGHT OUTERの入れ子に完全な連合を適用する方法を探しています。 ICN2_PKEY WHERE(ICN2.ICNID = N'65587 ' – phoenixAZ

+0

ただ1つの 'WHERE'句を使用する修正された回答を参照してください。 – Bohemian

+0

私は、私が左結合の連鎖的な検索をしていたとは思っていませんでした。 SQLクエリが、私は視覚的な基本を使用して掘り下げる再帰的なループを作成することができました。 – phoenixAZ

関連する問題