我正在处理其他一些开发人员代码,需要简化此查询,其格式如下。
SELECT
table1.id, table2.userid, table4.groupid
FROM
table1, table2, table3, table4
WHERE
userid = table4_userid
and
table2.id = table3.table2_id
and
table1.table3_id = table3.id
and
table3.statement_id = 264803
order by table4_groupid
但是我习惯通过明确提到连接类型来加入查询,即LEFT,RIGHT或OUTER join。我还使用TableName.TableField,以便我知道哪个字段来自哪个表。但是,正如你在上面看到的那样,tablename.tablefield和tablefield只是混合了一下。上面的查询工作正常,但我需要将table4作为LEFT JOIN,这样如果table4中没有任何匹配的行,它仍然应该显示一些数据。
我的问题是:
1)上面有哪些类型的连接?
2)如何更改上述查询以使table4成为LEFT JOIN?
我知道你可能想要原始查询,但我只需要指向正确的方向,我会自己做其余的。
答案 0 :(得分:1)
由于您在where语句中直接使用表,因此它将被视为普通INNER JOIN
。使用where语句来连接表是旧的加入方式,而且更难阅读。如果您想LEFT JOIN table4
,我建议您重写这样的查询:
SELECT
table1.id,
table2.userid,
table4.groupid
FROM
table1
JOIN table3
ON table1.table3_id = table3.id
JOIN table2
ON table2.id = table3.table2_id
LEFT JOIN table4
ON table2.userid = table4_userid
WHERE
table3.statement_id = 264803
order by
table4_groupid
答案 1 :(得分:1)
查看WHERE
之后的所有情况都是内部联接。
尝试这个,我不确定ON
,因为我们不知道表的结构:
SELECT
t1.id, t2.userid, COALESCE(t4.groupid, 0)
FROM
table1 t1 INNER JOIN table3 t3 ON t1.table3_id=t3.id
INNER JOIN table2 t2 ON t2.id=t3.table2_id
LEFT JOIN table4 t4 ON t1.userid=t4.table4_userid
WHERE
t3.statement_id = 264803
order by t4.groupid