我有以下4张table
表a:id、名称、b\U id、c\U id
表b:id、名称、d\U id
表c:id、名称、d\U 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\u id=d.id(如果a.b\u id!=0)或在c.d\u id=d.id上左连接d(如果a.b\u id==0)
我试着写信
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服务器版本相对应的手册,以获得使用“if(a.b\u id!=0,b.d上的左连接d(id=d.id),c.d上的左连接d(id=d.id),在第6行
3条答案
按热度按时间u91tlkcl1#
不能这样动态添加连接子句,但可以使用一些逻辑运算符模拟连接条件内的功能:
brgchamk2#
您可以尝试:
flmtquvp3#
你可以用:
这不需要时间
NULL
价值观。如果需要:在sql中,
CASE
返回值的表达式。它不是替换代码的宏。同时,这也回答了你在这里提出的问题。然而,这可能不是实现你想要的最有效的方法。如果你在表现方面也需要帮助,问一个新问题。提供示例数据、所需结果以及要实现的逻辑的解释。db/sqlfiddle也有帮助。