繁体   English   中英

无法使用联接或联合合并两个表

[英]Unable to merge two tables using join or union

这些是我的表: SELECT * FROM TableASELECT * FROM TableB

    Table A             Table B
    +-------+------+    +-------+------+ 
    | FileA | StepA|    | FileB | StepB|
    +-------+------+    +-------+------+ 
    |  001  |  1   |    |  001  |   1  |
    |  001  |  2   |    |  001  |   2  |
    |  001  |  3   |    |  001  |   3  |
    |  001  |  4   |    |  002  |   1  |
    |  001  |  5   |    |  002  |   2  |    
    |  002  |  1   |    |  002  |   3  |    
    |  002  |  2   |    |  003  |   1  |
    |  002  |  3   |    +-------+------+
    |  002  |  4   |    
    |  002  |  5   |  
    |  004  |  1   |    
    |  004  |  2   |    
    |  004  |  3   | 
    |  004  |  4   |    
    |  004  |  5   |
    +-------+------+ 

我的结果:

SELECT * FROM TableA AS TA LEFT JOIN TableB AS TB ON TA.FileA != TB.FileB GROUP BY TA.FileA ORDER BY TA.StepA ASC

    +-------+------+-------+------+ 
    | FileA | StepA| FileA | StepB|
    +-------+------+-------+------+ 
    |  001  |  1   |  001  |   1  |
    |  001  |  2   |  001  |   1  |
    |  001  |  3   |  001  |   1  |
    |  001  |  4   |  001  |   1  |
    |  001  |  5   |  001  |   1  |  
    +-------+------+-------+------+ 

但这是我的预期结果:

    +-------+------+-------+------+ 
    | FileA | StepA| FileB | StepB|
    +-------+------+-------+------+ 
    |  001  |  1   |  001  |   1  |
    |  001  |  2   |  001  |   2  |
    |  001  |  3   |  001  |   3  |
    |  001  |  4   |  null | null |
    |  001  |  5   |  null | null |
    |  002  |  1   |  002  |   1  |    
    |  002  |  2   |  002  |   2  |    
    |  002  |  3   |  002  |   3  |       
    |  002  |  4   |  null | null |       
    |  002  |  5   |  null | null |  
    |  null | null |  003  |   1  |          
    |  004  |  1   |  null | null |    
    |  004  |  2   |  null | null |      
    |  004  |  3   |  null | null |    
    |  004  |  4   |  null | null |      
    |  004  |  5   |  null | null |    
    +-------+------+-------+------+ 

是否可以使用joins或union进行这些操作,以便获得这些输出?

我认为这些SQL对您有用。

    SELECT * FROM (

       SELECT * FROM tablea AS TA LEFT JOIN tableb AS TB 
    ON TA.FileA = TB.FileB AND TA.stepA= TB.stepB 

UNION
     SELECT * FROM tablea AS TA RIGHT JOIN tableb AS TB 
    ON TA.FileA = TB.FileB AND TA.stepA= TB.stepB ) a
  ORDER BY FileA, stepA,fileb ASC

谢谢。

如果您确实想以此方式对值进行排序,则可以在子查询上使用coalesce():

SELECT 
    sub.`FileA`, 
    sub.`StepA`, 
    sub.`FileB`, 
    sub.`StepB` 
FROM 
    (
        SELECT 
            ta.`FileA`, 
            ta.`StepA`, 
            tb.`FileB`, 
            tb.`StepB`, 
            coalesce(ta.`FileA`, tb.`FileB`) AS `File`, 
            coalesce(ta.`StepA`, tb.`StepB`) AS `Step` 
        FROM 
            `TableA` ta 
            LEFT OUTER JOIN `TableB` tb ON (
                ta.`FileA` = tb.`FileB` 
                AND ta.`StepA` = tb.`StepB`
            ) 
        UNION 
        SELECT 
            ta.`FileA`, 
            ta.`StepA`, 
            tb.`FileB`, 
            tb.`StepB`, 
            coalesce(ta.`FileA`, tb.`FileB`) AS `File`, 
            coalesce(ta.`StepA`, tb.`StepB`) AS `Step` 
        FROM 
            `TableA` ta 
            RIGHT OUTER JOIN `TableB` tb ON (
                ta.`FileA` = tb.`FileB` 
                AND ta.`StepA` = tb.`StepB`
            )
    ) sub
ORDER BY 
    sub.`File` ASC, 
    sub.`Step` ASC

有关COALESCE的更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM