2

1 つの「マスター」テーブルと、以下のような詳細を持つ 3 つの他のテーブルがあります。

                +----------+
                |  TAB_A   |
                +----------+
               *|PK ID_A   |
 +----------+ / |FK ID_MAIN|
 |TableMain |/  | DATA_A   |
 ------------   ============
 |PK ID_MAIN|   +----------+   
 | Main_data|--*|  TAB_B   |
 |          |   +----------+
 ============   |PK ID_B   |
            |   |FK ID_MAIN|
            |   | DATA_B   |
            *   ============
       +-----------+
       | TAB_C     |
       +-----------+
       | PK ID_C   |
       | FK ID_MAIN| 
       | DATA_C    |
       =============

値の例:

        TableMain:            
    ID_MAIN   Main_data
       1        main1
       2        main2
       3        main3

       TAB_A           |          TAB_B          |           TAB_C
ID_A  ID_MAIN  DATA_A  | ID_B  ID_MAIN  DATA_B   |   ID_C  ID_MAIN  DATA_C
 1      2        A2    |  1      1       B3      |    1       3       C3
 2      1        A1    |  2      1       B3_1    |
 3      1        A1_1
 4      3        A3
 5      1        A1_2

そして、TableMain の各 rekord について、TAB_A、TAB_B、および TAB_C のすべての詳細が必要です。出力は次のようになります

ID_MAIN  | Main_data | DATA_A | DATA_B | DATA_C |
-------------------------------------------------
1        |   main1   |        |  B3    |        |
         |   main1   |        |  B3_1  |        |
2        |   main2   |  A2    |        |        |
3        |   main3   |  A3    |        |   C3   |
4

4 に答える 4

1

異なるテーブルの値を同じ行に配置したいので、どうにかしてそれらを互いに関連付ける必要があります。実際の関係がない場合は、おそらく作成する必要があります。1 つの提案はID_MAIN、3 つの従属テーブルごとに行番号を割り当て、それらの番号を照合に使用することです。

SQL Server 2005 以降のバージョンを使用している場合は、ROW_NUMBER分析関数を使用して行番号を追加できます。クエリ全体は次のようになります。

WITH A_ranked AS (
  SELECT *, ROW_NUM = ROW_NUMBER() OVER (PARTITION BY ID_MAIN ORDER BY ID_A)
  FROM TAB_A
),
B_ranked AS (
  SELECT *, ROW_NUM = ROW_NUMBER() OVER (PARTITION BY ID_MAIN ORDER BY ID_B)
  FROM TAB_B
),
C_ranked AS (
  SELECT *, ROW_NUM = ROW_NUMBER() OVER (PARTITION BY ID_MAIN ORDER BY ID_C)
  FROM TAB_C
)
SELECT
  ID_MAIN = COALESCE(a.ID_MAIN, b.ID_MAIN, c.ID_MAIN),
  m.Main_data,
  ROW_NUM = COALESCE(a.ROW_NUM, b.ROW_NUM, c.ROW_NUM),
  a.DATA_A,
  b.DATA_B,
  c.DATA_C
FROM
  A_ranked AS a
FULL JOIN
  B_ranked AS b ON b.ID_MAIN = a.ID_MAIN
               AND b.ROW_NUM = a.ROW_NUM
FULL JOIN
  C_ranked AS c ON c.ID_MAIN = COALESCE(a.ID_MAIN, b.ID_MAIN)
               AND c.ROW_NUM = COALESCE(a.ROW_NUM, b.ROW_NUM)
RIGHT JOIN
  TableMain AS m ON m.ID_MAIN = COALESCE(a.ID_MAIN, b.ID_MAIN, c.ID_MAIN)
;

SQL Fiddle で、このクエリのライブ デモを見ることができます。

于 2013-10-03T07:28:12.063 に答える
0

あなたが望むのは単純なようですLEFT JOIN

select TableMain.ID_MAIN, TableMain.Main_data, TAB_A.DATA_A, TAB_B.DATA_B, TAB_C.DATA_C
from TableMain
left join TAB_A on TAB_A.ID_MAIN=TableMain.ID_MAIN
left join TAB_B on TAB_B.ID_MAIN=TableMain.ID_MAIN
left join TAB_C on TAB_C.ID_MAIN=TableMain.ID_MAIN;

ドキュメンテーションはこちら

于 2013-10-02T18:07:06.793 に答える
0

これは単なる左結合のトリオではありませんか? ここでフィドル

SELECT
            M.[ID_MAIN],
            M.[Main_data],
            A.[DATA_A],
            B.[DATA_B],
            C.[DATA_C]
    FROM
            [TableMain] M
        LEFT JOIN
            [TAB_A] A
                ON A.[ID_MAIN] = M.[ID_MAIN]
        LEFT JOIN
            [TAB_B] B
                ON B.[ID_MAIN] = M.[ID_MAIN]
        LEFT JOIN
            [TAB_C] C
                ON C.[ID_MAIN] = M.[ID_MAIN]
    ORDER BY
            M.[ID_MAIN] ASC
于 2013-10-03T11:02:36.827 に答える