Mysql 如何根据条件选择要内部联接的表
我需要一个SQL select,其中查询可以根据主表列的值选择要内部联接的表。大概是这样的: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
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
,以模拟相同的行为(即不返回不匹配的行)。请参阅