Mysql 如何根据条件选择要内部联接的表

Mysql 如何根据条件选择要内部联接的表,mysql,sql,Mysql,Sql,我需要一个SQL select,其中查询可以根据主表列的值选择要内部联接的表。大概是这样的: select a.col1, a.col2, b.col1 from tblA a if a.col2 = 'Moe' inner join tblB1 b on tblA.id = tblB1.id elseif a.col2 = 'Larry' inner join tblB2 b on tblA.id = tblB2.id elseif a.col2 = 'Curly' inner join tb

我需要一个SQL select,其中查询可以根据主表列的值选择要内部联接的表。大概是这样的:

select a.col1, a.col2, b.col1
from tblA a
if a.col2 = 'Moe' inner join tblB1 b on tblA.id = tblB1.id
elseif a.col2 = 'Larry' inner join tblB2 b on tblA.id = tblB2.id
elseif a.col2 = 'Curly' inner join tblB3 b on tblA.id = tblB3.id 
else inner join tblB4 b on tblA.id = tblB4.id 
select a.col1, a.col2,
      coalesce(bm.col1, bl.col1, bc.col1, b.col1) as col1
from tblA a left join
     tblB1 bm
     on a.id = bm.id and a.col2 = 'Moe' left join 
     tblB2 bl
     on a.id = bl.id and a.col2 = 'Larry' left join
     tblB3 bc
     ona.id = mc.id and a.col2 = 'Curly' left join 
     tblB4 b
     on a.id = b.id and
        a.col2 not in ('Moe', 'Larry', 'Curly');

如果a.col2是‘Moe’、‘Larry’或‘Curly’中的任何一个,则内部连接指向各自的表。如果不是这三种连接中的任何一种,则内部连接指向一个回退表

使用
左连接
,如下所示:

select a.col1, a.col2, b.col1
from tblA a
if a.col2 = 'Moe' inner join tblB1 b on tblA.id = tblB1.id
elseif a.col2 = 'Larry' inner join tblB2 b on tblA.id = tblB2.id
elseif a.col2 = 'Curly' inner join tblB3 b on tblA.id = tblB3.id 
else inner join tblB4 b on tblA.id = tblB4.id 
select a.col1, a.col2,
      coalesce(bm.col1, bl.col1, bc.col1, b.col1) as col1
from tblA a left join
     tblB1 bm
     on a.id = bm.id and a.col2 = 'Moe' left join 
     tblB2 bl
     on a.id = bl.id and a.col2 = 'Larry' left join
     tblB3 bc
     ona.id = mc.id and a.col2 = 'Curly' left join 
     tblB4 b
     on a.id = b.id and
        a.col2 not in ('Moe', 'Larry', 'Curly');
如果您也在使用联接过滤行(即,预期
a
中的某些行不匹配),则添加:

where bm.id is not null or bl.id is not null or
      bc.id is not null or b.id is not null

这将确保至少有一个匹配。

使用
左连接,如下所示:

select a.col1, a.col2, b.col1
from tblA a
if a.col2 = 'Moe' inner join tblB1 b on tblA.id = tblB1.id
elseif a.col2 = 'Larry' inner join tblB2 b on tblA.id = tblB2.id
elseif a.col2 = 'Curly' inner join tblB3 b on tblA.id = tblB3.id 
else inner join tblB4 b on tblA.id = tblB4.id 
select a.col1, a.col2,
      coalesce(bm.col1, bl.col1, bc.col1, b.col1) as col1
from tblA a left join
     tblB1 bm
     on a.id = bm.id and a.col2 = 'Moe' left join 
     tblB2 bl
     on a.id = bl.id and a.col2 = 'Larry' left join
     tblB3 bc
     ona.id = mc.id and a.col2 = 'Curly' left join 
     tblB4 b
     on a.id = b.id and
        a.col2 not in ('Moe', 'Larry', 'Curly');
如果您也在使用联接过滤行(即,预期
a
中的某些行不匹配),则添加:

where bm.id is not null or bl.id is not null or
      bc.id is not null or b.id is not null

这将确保至少有一个匹配。

您也可以使用
准备好的语句

您为查询准备了一个字符串并执行它


您也可以使用
准备好的语句

您为查询准备了一个字符串并执行它


害羞地!尝试一下:

选择a.col1、a.col2、COALESCE(b.col1、c.col1、d.col1、e.col1)作为col1
来自tblA a
在a.id=b.id和a.col2='Moe'上左连接tblB1 b
在a.id=c.id和a.col2='Larry'上左连接tblB2 c
在a.id=d.id和a.col2='Curly'上左连接tblB3 d
a.id=e.id和a.col2上的左连接tblB4 e
;
这将从所有四个“B”表中获取行,并通过
COALESCE
构造仅返回相应的匹配行。这假设
id
是每个表中的
PK

我本来打算在最后一个
左连接中包含
不在
中,但它不是必需的,因为
合并
将优先考虑来自早期连接的值。纽约,纽约,纽约


另外,正如Gordon所建议的,由于您在初始查询中有所有
内部联接
,因此您需要添加
,其中b.id不为NULL或c.id不为NULL或d.id不为NULL或e.id不为NULL
,以模拟相同的行为(即,不要返回不匹配的行)。

!尝试一下:

选择a.col1、a.col2、COALESCE(b.col1、c.col1、d.col1、e.col1)作为col1
来自tblA a
在a.id=b.id和a.col2='Moe'上左连接tblB1 b
在a.id=c.id和a.col2='Larry'上左连接tblB2 c
在a.id=d.id和a.col2='Curly'上左连接tblB3 d
a.id=e.id和a.col2上的左连接tblB4 e
;
这将从所有四个“B”表中获取行,并通过
COALESCE
构造仅返回相应的匹配行。这假设
id
是每个表中的
PK

我本来打算在最后一个
左连接中包含
不在
中,但它不是必需的,因为
合并
将优先考虑来自早期连接的值。纽约,纽约,纽约

此外,正如Gordon所建议的,由于您在初始查询中拥有所有
内部联接
,因此需要添加
,其中b.id不为NULL或c.id不为NULL或d.id不为NULL或e.id不为NULL
,以模拟相同的行为(即不返回不匹配的行)。

请参阅