无法使用join或union合并两个表

时间:2015-07-31 06:04:50

标签: mysql join

这些是我的表格: 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 |    
    +-------+------+-------+------+ 

是否可以使用连接或联合执行这些操作以便我可以获得这些输出?

2 个答案:

答案 0 :(得分:0)

我认为这些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

谢谢。

答案 1 :(得分:0)

如果您真的想以这种方式订购价值,可以在子查询中使用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

的更多信息