这已经在不同的情况下被问到并得到了回答,但我所看到的所有内容都不适用于我的问题。
问题:我需要同时从 3 个表中提取数据来比较和检索信息。所有 3 个表都包含一个“电子邮件”列。现在,来自 table1 的用户的电子邮件可能与 table2 和 table3 中的同一用户的电子邮件匹配,具体取决于用户的状态。或者来自 table1 的电子邮件将仅匹配 table2 或 table3 中的电子邮件,这取决于用户的状态。例如,用户可能有红色状态(用户将显示在 table2 中)、蓝色状态(用户将显示在 table3 中),或两者兼有,红色和蓝色(用户将显示在 table2 和 table3 中)。
需要做什么:需要将来自 table1 的电子邮件与 table2 和 table3 中的电子邮件进行比较,并返回给定用户的区域值,该值记录在 table2 和 table3 中但不在 table1 中。我知道。令人愉快的数据架构!无论哪种方式,我都能够JOIN非常成功地将table1 转换为 table2,但我不确定如何JOIN使用 table3。
这是对 2 个表的查询:
SELECT * FROM table1
INNER JOIN table2
ON table2.email = table1.email
WHERE month = 'numberHere' ORDER BY submitdate DESC
Run Code Online (Sandbox Code Playgroud)
当我简单地添加另一个INNER JOIN代码时,我的代码不会中断,但它也没有给我任何要显示的行。因此,尽管网络上有许多工作示例,但下面的代码不起作用:
SELECT * FROM table1
INNER JOIN table2
ON table2.email = table1.email
INNER JOIN table3
ON table3.email = table2.email
WHERE month = 'numberHere' ORDER BY submitdate DESC
Run Code Online (Sandbox Code Playgroud)
您需要使用LEFT JOIN, 这样即使其中一个表中没有匹配的行,连接也会成功。
SELECT * FROM table1
LEFT JOIN table2
ON table2.email = table1.email
LEFT JOIN table3
ON table3.email = table2.email
WHERE month = 'numberHere'
AND (table2.email IS NOT NULL OR table3.email IS NOT NULL)
ORDER BY submitdate DESC
Run Code Online (Sandbox Code Playgroud)
附加条件过滤掉任一表中没有匹配项的行。
要table1在任何情况下匹配来自其他表的行和其他表的行,您必须使用LEFT JOIN, jointable2和table3with table1(而不是table2withtable1和table3with tabel2):
SELECT * FROM table1
LEFT JOIN table2
ON table2.email = table1.email
LEFT JOIN table3
ON table3.email = table1.email
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您table1甚至可以从其他表中没有匹配项的情况下选择值。
查看更多关于 SQL 连接:不同的 SQL 连接
| 归档时间: |
|
| 查看次数: |
23889 次 |
| 最近记录: |