【问题标题】:SQL - Join Parent-Child tables. How can I build this query?SQL - 加入父子表。如何构建此查询?
【发布时间】:2017-03-14 03:32:52
【问题描述】:

我有以下表格:https://i.stack.imgur.com/XIzTc.png 我需要构建一个查询来从所有表中选择数据。

我知道要在 A、B、C 和 D 之间获取数据;我应该进行左连接,但问题是当我尝试连接 E 和 F 时。

  • 是否可以在一个查询中获取所有数据?怎么样?
  • 我认为一种解决方案是在 A 和直接子表(B、C、D)之间进行左连接,然后在 BE、CE 和 DF 中对每一行进行内连接,但这是一个好的解决方案吗?

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 需要选择哪些数据?您认为您提出了一个完整、独立的问题吗?

标签: jquery sql oracle join oracle11g


【解决方案1】:

由于没有给出数据参考,我对表格采用了基于级别的输入

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 不为空时,B&C 与 E 连接。与 D 到 F 的连接相同。 希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2011-01-05
    • 1970-01-01
    • 2021-10-26
    • 2016-06-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 2012-07-09
    • 2012-01-22
    相关资源
    最近更新 更多