【问题标题】:SQL Multiple JoiningSQL 多重连接
【发布时间】:2021-05-07 10:25:56
【问题描述】:

我正在尝试加入两个表,同时通过使用内连接获取某个列的值,我尝试加入到第三张图,但是当涉及到第四张图时,它不显示 null值,如何显示第 4 列的值,即使是空值

这是 SQL 的代码

betl.user_id,
betl.agent_id,
ah1.parent_id,
ah2.user_id, 
ah3.user_id AS parent_of_agent
       FROM
       wpc16_02.bets_logs betl
          INNER JOIN
          wpc16_02.agent_heirarchy ah1 ON betl.agent_id = ah1.user_id
          INNER JOIN
          wpc16_02.agent_heirarchy ah2 ON ah1.parent_id = ah2.id
          INNER JOIN
          wpc16_02.agent_heirarchy ah3 ON ah2.parent_id = ah3.id
       WHERE
           fight_id = 1930 AND agent_income = 0

这是我试图通过使用内部连接来实现的目标:

这是我尝试加入第三张图时得到的结果:

user_id | agent_id  | parent_id | user_id_of_parent
15012   | 2212      | 96        |  160
227097  | 22061     | 266       |  64
465174  | 464899    | 126       |  211
505094  | 504767    | 980       |  5358
241158  | 8281      | 18        |  67
463344  | 462715    | 751       |  3420
184396  | 29870     | 502       |  2123
486847  | 43225     | 164       |  234
482120  | 482023    | 4430      |  46469
369628  | 217212    | 8283      |  109697

当加入到第 4 个图表时:

 user_id | agent_id  | parent_id | user_id_of_parent | master_uid
 184396  | 29870     | 502       | 2123              |  160
 482120  | 482023    | 4430      | 46469             |  699
 369628  | 217212    | 8283      | 109697            |  71
 97287   | 93996     | 7332      | 93866             |  3114
 113287  | 113228    | 2714      | 20652             |  4050
 366287  | 361918    | 17603     | 235880            |  234
 439935  | 236147    | 3776      | 40054             |  103
 480201  | 436936    | 1041      | 5761              |  160
 456400  | 456248    | 32901     | 431900            |  240
 502877  | 497592    | 2571      | 20845             |  3918

请注意其他数据已被删除,因为当我加入第 4 个图表时,一些结果为空

【问题讨论】:

  • 限定所有列是一种很好的编程习惯——至少在涉及多个表时是这样。 (例如,WHERE 子句列属于哪些表?)
  • 向我们展示一些示例表数据和预期结果 - 全部为格式化文本(无图像)。如果可能,请简化,即minimal reproducible example
  • 如果要包含空值,假设连接谓词不匹配,则需要使用外连接。在这种情况下,我会使用左连接。这还假设您的 WHERE 子句未过滤表中可能包含空值的列。
  • 您需要在所有联接中使用LEFT JOINTable2 作为左表,因为每个级别的parent_id 列中可能存在nulls。但是对于层次结构构建,最好使用递归 CTE,其语法和支持取决于 DBMS。
  • @JianRuizMangampo 我认为如果您真的只需要 3 级层次结构并使用您当前的查询。对于所有层次结构树,我建议使用递归,您需要在递归步骤中使用INNER JOIN 来打破无限循环。

标签: sql join inner-join


【解决方案1】:

你似乎想要LEFT JOIN。有点不清楚确切的查询是什么,因为您的问题没有诸如哪些列在哪些表中之类的信息。

但想法是:

SELECT . . .
FROM wpc16_02.bets_logs betl LEFT JOIN
     wpc16_02.agent_heirarchy ah1
     ON betl.agent_id = ah1.user_id LEFT JOIN
     wpc16_02.agent_heirarchy ah2
     ON ah1.parent_id = ah2.id LEFT JOIN
     wpc16_02.agent_heirarchy ah3
     ON ah2.parent_id = ah3.id
WHERE betl.fight_id = 1930 AND betl.agent_income = 0

这假定 flight_idagent_income 来自 first 表。如果它们位于其中一个层次结构表中,则条件应放在适当的ON 子句中。

【讨论】:

    猜你喜欢
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2011-12-12
    • 1970-01-01
    相关资源
    最近更新 更多