【问题标题】:How do I select a table to inner join based on a condition如何根据条件选择要进行内部联接的表
【发布时间】:2019-11-20 10:58:26
【问题描述】:

我需要一个 SQL 选择,其中查询可以根据主表列的值选择要进行内连接的表。像这样的:

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 

如果 a.col2 是“Moe”、“Larry”或“Curly”中的任何一个,则内部连接指向它们各自的表。如果不是这三个中的任何一个,则内部连接指向一个备用表

【问题讨论】:

标签: mysql sql


【解决方案1】:

使用left join,像这样:

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

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

【讨论】:

    【解决方案2】:

    狡猾!试试这个:

    SELECT a.col1, a.col2, COALESCE(b.col1, c.col1, d.col1, e.col1) AS col1
    FROM tblA a
    LEFT JOIN tblB1 b on a.id = b.id AND a.col2 = 'Moe'
    LEFT JOIN tblB2 c on a.id = c.id AND a.col2 = 'Larry'
    LEFT JOIN tblB3 d on a.id = d.id AND a.col2 = 'Curly'
    LEFT JOIN tblB4 e on a.id = e.id AND a.col2
    ;
    

    这将从所有四个“B”表中获取行,并仅通过COALESCE 构造返回适当的匹配行。这假设id 是每个表中的PK

    我打算在最后一个LEFT JOIN 中包含一个NOT IN,但它不需要,因为COALESCE 将优先考虑来自早期连接的值。纽克,纽克,纽克。

    此外,正如 Gordon 所建议的,由于您在初始查询中包含所有 inner joins,因此您需要添加 WHERE b.id is NOT NULL OR c.id IS NOT NULL OR d.id IS NOT NULL OR e.id IS NOT NULL 以模仿相同的行为(即不返回不匹配的行)。

    【讨论】:

      【解决方案3】:

      你也可以使用Prepared Statements

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

      Check the doc here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多