2016-11-01 42 views
-1

我有以下表格:https://i.stack.imgur.com/XIzTc.png 我需要建立一個查詢來從所有表中選擇數據。SQL - 加入父 - 子表。我如何構建這個查詢?

我知道要獲取A,B,C和D之間的數據;我應該進行左連接,但麻煩是當我嘗試加入E和F.

  • 是否可以在單個查詢中獲取所有數據?怎麼樣?
  • 我認爲一種解決方案是在A和立即數子表(B,C,D)之間建立一個左連接,然後在每行的B-E,C-E和D-F中進行內連接,但這是一個好的解決方案嗎?

任何幫助,將不勝感激。

謝謝。

+0

**您需要選擇哪些**數據?你認爲你問了一個完整的,自包含的問題嗎? – mathguy

回答

0

由於沒有數據參考給出我已經採取了基於電平輸入的表

WITH tab_a AS 
(SELECT  'Tab_A_' || LEVEL a_id_a, 'Tab_A_VAL_' || LEVEL a_col_1, 
      'Tab_A_VAL_' || (LEVEL + 10) a_col_2 
     FROM DUAL 
    CONNECT BY LEVEL <= 9), 
tab_b AS 
(SELECT  'Tab_A_' || LEVEL b_id_a, 'Tab_B_' || LEVEL b_id_b, 
      'Tab_B_VAL_' || LEVEL b_col_1, 
      'Tab_B_VAL_' || (LEVEL + 20) b_col_2 
     FROM DUAL 
    CONNECT BY LEVEL BETWEEN 1 AND 5), 
tab_c AS 
(SELECT  'Tab_A_' || LEVEL c_id_a, 'Tab_C_' || LEVEL c_id_c, 
      'Tab_C_VAL_' || LEVEL c_col_1, 
      'Tab_C_VAL_' || (LEVEL + 30) c_col_2 
     FROM DUAL 
    CONNECT BY LEVEL BETWEEN 1 AND 5), 
tab_d AS 
(SELECT  'Tab_A_' || LEVEL d_id_a, 'Tab_D_' || LEVEL d_id_d, 
      'Tab_D_VAL_' || LEVEL d_col_1, 
      'Tab_D_VAL_' || (LEVEL + 40) d_col_2 
     FROM DUAL 
    CONNECT BY LEVEL BETWEEN 1 AND 5), 
tab_e AS 
(SELECT  'Tab_B_' || LEVEL e_id_b, 'Tab_C_' || LEVEL e_id_c, 
      'Tab_E_' || LEVEL e_id_e, 'Tab_E_VAL_' || LEVEL e_col_1, 
      'Tab_E_VAL_' || (LEVEL + 50) e_col_2 
     FROM DUAL 
    CONNECT BY LEVEL BETWEEN 1 AND 3), 
tab_f AS 
(SELECT  'Tab_D_' || LEVEL f_id_d, 'Tab_F_' || LEVEL f_id_f, 
      'Tab_F_VAL_' || LEVEL f_col_1, 
      'Tab_F_VAL_' || (LEVEL + 60) f_col_2 
     FROM DUAL 
    CONNECT BY LEVEL BETWEEN 1 AND 4) SELECT * 
FROM tab_a a LEFT OUTER JOIN tab_b b ON (a.a_id_a = b.b_id_a) 
    LEFT OUTER JOIN tab_c c ON (a.a_id_a = c.c_id_a) 
    LEFT OUTER JOIN tab_d d ON (a.a_id_a = d.d_id_a) 
    LEFT OUTER JOIN tab_e e 
    ON (b.b_id_b = e.e_id_b AND c.c_id_c = e.e_id_c) 
    LEFT OUTER JOIN tab_f f ON (d.d_id_d = f.f_id_d)ORDER BY 1 

注意聯接。 B & C與E連接時B & C不爲空。與D到F的連接相同。 希望這有助於。

+0

如果這解決了您的問題,請不要忘記標記爲可接受的解決方案 – Debabrata