我有以下4个表格
表A:id,name,b_id,c_id
表B:id,名称,d_id
表C:id,名称,d_id
表D:id,名称
然后我有我的疑问,就我能写的来说:
SELECT a.name as a_name, b.name as b_name, c.name as c_name, d.name as d_name
FROM a
LEFT JOIN b ON a.b_id = b.id
LEFT JOIN c ON a.c_id = c.id
我需要添加一个左联接地址表“d”,它带有一个ON,这是动态的。 应在B.D_ID=d.ID(如果A.B_ID!=0)上左联接d,或在C.D_ID=d.ID(如果A.B_ID==0)上左联接d
我试着写
SELECT a.name as a_name, b.name as b_name, c.name as c_name, d.name as d_name
FROM a
LEFT JOIN b ON a.b_id = b.id
LEFT JOIN c ON a.c_id = c.id
if((if a.b_id != 0,LEFT JOIN d ON b.d_id = d.id, LEFT JOIN d ON c.d_id = d.id )
但这会产生错误
您的SQL语法中有一个错误; 检查与您的MariaDB服务器版本相对应的手册,以便在第6行的'if(a.b_id!=0,LEFT JOIN d ON b.d_id=d.id,LEFT JOIN d ON c.d_id=d.id)'附近使用正确的语法。“
您不能像那样动态地添加联接子句,但是您可以用一些逻辑运算符模拟联接条件中的功能:
SELECT a.name as a_name, b.name as b_name, c.name as c_name, d.name as d_name
FROM a
LEFT JOIN b ON a.b_id = b.id
LEFT JOIN c ON a.c_id = c.id
LEFT JOIN d ON (a.b_id != 0 AND b.d_id = d.id) OR (a.b_id = 0 AND c.d_id = d.id)
您可以尝试:
SELECT a.name as a_name, b.name as b_name, c.name as c_name, d.name as d_name
FROM a
LEFT JOIN b ON a.b_id = b.id
LEFT JOIN c ON a.c_id = c.id
LEFT JOIN
ON (a.b_id <> 0 AND b.d_id = d.id) OR (a.b_id = 0 AND c.d_id = d.id);
你可以使用:
FROM a LEFT JOIN
b
ON a.b_id = b.id LEFT JOIN
c
ON a.c_id = c.id LEFT JOIN
d
ON (a.b_id <> 0 AND b.d_id = d.id) OR
(a.b_id = 0 AND c.d_id = d.id)
这没有考虑null
值。 如果需要:
ON (a.b_id <> 0 AND b.d_id = d.id) OR
(COALESCE(a.b_id, 0) = 0 AND c.d_id = d.id)
在SQL中,case
是返回值的表达式。 它不是代码被替换的宏。
这也回答了你在这里提出的问题。 然而,这可能不是实现所需目标的最佳方式。 如果您还需要性能方面的帮助,请提出一个新问题。 提供示例数据,期望的结果以及对您想要实现的逻辑的解释。 DB/SQL小提琴也有帮助。