【发布时间】: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 JOIN和Table2作为左表,因为每个级别的parent_id列中可能存在nulls。但是对于层次结构构建,最好使用递归 CTE,其语法和支持取决于 DBMS。 -
@JianRuizMangampo 我认为如果您真的只需要 3 级层次结构并使用您当前的查询。对于所有层次结构树,我建议使用递归,您需要在递归步骤中使用
INNER JOIN来打破无限循环。
标签: sql join inner-join