我有<{p>形式的多个JOIN
SELECT * FROM column1
LEFT JOIN column2 USING(id)
JOIN column3 USING(name)
JOIN column4 USING(info)
WHERE column1.id = 44
如果将LEFT JOIN
更改为JOIN
;由于显而易见的原因,在没有column2.id的情况下,查询将不返回任何内容。主要数据是第1列,其他数据是支持数据;因此,我想在column1.id存在的情况下检索数据。
我的问题是:第一个LEFT JOIN
是否保证查询返回column1.id存在的column1值,而不管后续JOIN
s(例如,当column3.name不存在时)?或者我需要将下一个(所有)JOIN
更改为LEFT JOIN
吗?
答案 0 :(得分:2)
您有几个选项,因为您的问题的直接答案是no
。
将所有后续连接更改为LEFT JOIN。
SELECT * FROM column1
LEFT JOIN column2 USING(id)
LEFT JOIN column3 USING(name)
LEFT JOIN column4 USING(info)
WHERE column1.id = 44
如果可能,请重新安排查询...
SELECT * FROM column1
JOIN column3 USING(name)
JOIN column4 USING(info)
LEFT JOIN column2 USING(id)
WHERE column1.id = 44
或者...
SELECT * FROM column1
JOIN
(
column3
JOIN column4 USING(info)
LEFT JOIN column2 USING(id)
)
USING(name)
WHERE column1.id = 44
另外,我会避免使用自然连接和USING
语法。逻辑不太透明,对bug有更多的开放性,以后更容易打破(如果你在其中一个表中添加一个复制USING选项中的字段的表)等等。
答案 1 :(得分:1)
他们“连在一起”,所以他们都应该保持联接。
答案 2 :(得分:0)
您需要left
s。
每个JOIN都会尝试将以前连接的结果连接到下一个表格。
你可以这样认为:
((column1
LEFT JOIN column2 USING(id)
)
JOIN column3 USING(name)
)
JOIN column4 USING(info)
WHERE column1.id = 44