1

次のテーブルがあります

table 2 with a fk to table 1
table 3 with a fk to table 1

テーブル 2 には、テーブル 1 にリンクされた 2 つの行があります テーブル 3 には、テーブル 1 にリンクされた 1 つの行があります

を持つテーブルを作成しようとしています

| table1 pk  | table 2 pk | null |
| table1 pk  | table 2 pk | null |
| table1 pk  | null | table 3 pk |

ただし、次のことを試すと、

select tab1.id, tab2.id, tab3.id
from table1 tab1 
left join tab2 on tab1.id = tab2.tab1_id
left join tab3 on tab1.id = tab3.tab1_id

この表を与える

| table1 pk  | table 2 pk | table 3 pk |
| table1 pk  | table 2 pk | table 3 pk |

誰でもこのSQLを手伝ってもらえますか?

前もって感謝します

編集

これを少し単純化しすぎたのではないかと思います。理想的には出力は

| table1 pk  | table 2 pk |
| table1 pk  | table 3 pk |
| table1 pk  | table 3 pk |

この結合が機能するようになると、別の大規模なクエリに追加されます...

4

3 に答える 3

1

1つの珍しい解決策は

select coalesce(t2.tab1_id, t3.tab1_id) pk,
   t2.pk, t3.pk
from table2 t2 
   full join table3 t3
       on t3.tab1_id = t2.tab1_id
where exists (select * from table1
              where pk in (t2.tab1_id, t3.tab1_id)

注 (編集) コメントで Andriy M が指摘したように、where 句は、FK 制約が table2 および table3 に適切に適用されている場合に存在できない、table1 に FK が存在しない table2 および table3 からのみ行を削除します。

于 2013-10-30T13:09:48.253 に答える
1

ここにはクレイジーなものは何も見えません

WITH TAB1
    AS (SELECT 1 AS ID FROM DUAL
        UNION ALL
        SELECT 2 AS ID FROM DUAL
        UNION ALL
        SELECT 3 AS ID FROM DUAL),
    TAB2
    AS (SELECT 1 AS TAB1_ID, 'A' AS ID FROM DUAL
        UNION ALL
        SELECT 2 AS TAB1_ID, 'B' AS ID
        FROM DUAL),
    TAB3
    AS (SELECT 3 AS TAB1_ID, 'C' AS ID
        FROM DUAL)
SELECT
      TAB1.ID,
      COALESCE ( TAB2.ID,
               TAB3.ID )
FROM
      TAB1
      LEFT JOIN TAB2
          ON TAB1.ID = TAB2.TAB1_ID
      LEFT JOIN TAB3
          ON TAB1.ID = TAB3.TAB1_ID;

1   A   
2   B   
3   C
于 2013-10-30T13:12:08.663 に答える