无法使用左外连接获得我的预期输出

时间:2014-11-19 07:06:49

标签: mysql

这是我的样本表:

MODEL1

        +-----+--------+
        | nos | nameNo |
        +-----+--------+
        | 1   | 1345   |
        | 2   | 1345   |
        | 3   | 3306   |
        +-----+--------+

MODEL2

        +-----+--------+
        | nos | nameNo |
        +-----+--------+
        | 1   | 3701   |
        | 2   | 1345   |
        | 4   | 2876   |
        | 5   | 1343   |
        | 6   | 3572   |
        | 7   | 1793   |
        | 33  | 2041   |
        | 34  | 1509   |
        | 35  | 1577   |
        | 36  | 1869   |
        | 37  | 1578   |
        | 38  | 2876   |
        | 39  | 1345   |
        +-----+--------+

这是我的SQL查询:

SELECT model1.nos, model1.nameNo, model2.nos, model2.nameNo  
FROM sample.model1 left outer join sample.model2 on model1.nameNo = model2.nameNo 
group by model1.nos;

我的输出:

        +-----+--------++-----+--------+
        | nos | nameNo | nos  | nameNo |
        +-----+--------+------+--------+
        | 1   | 1345   | 2    | 1345   |
        | 2   | 1345   | 2    | 1345   |
        | 3   | 3306   | null | null   |
        +-----+--------+------+--------+

我的预期输出应该是这些,但我对我的代码查询感到困惑,请帮助,提前感谢:

        +-----+--------++-----+--------+
        | nos | nameNo | nos  | nameNo |
        +-----+--------+------+--------+
        | 1   | 1345   | 2    | 1345   |
        | 2   | 1345   | 39   | 1345   |
        | 3   | 3306   | null | null   |
        +-----+--------+------+--------+

2 个答案:

答案 0 :(得分:0)

使用distinct而不是group by:

SELECT distinct model1.nos, model1.nameNo, model2.nos, model2.nameNo  
FROM sample.model1 
left outer join sample.model2 
on model1.nameNo = model2.nameNo 

由于MySQL扩展了GROUP BY的使用,因此选择列表可以引用GROUP BY子句中未命名的非聚合列。在MySQL Handling of GROUP BY中说:

  

但是,当GROUP BY中未命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。此外,添加ORDER BY子句不会影响每个组中值的选择。

这就是为什么你未能通过查询获得预期的结果。

答案 1 :(得分:0)

Join从条件匹配的行中生成笛卡尔输出。表1中有两行匹配model1.nameNo = model2.nameNo上表2中的两行,然后输出有(2x2 = 4)行加上table1中没有与table2匹配的行。

但是,您在预期结果中对应行的方式不是基于特定关系,创建结果将是一项艰巨的任务。

似乎你只想要两个表中具有相同nameNo的行的列的并集,也许以下代码可以帮助您解决它。

    SELECT distinct nos, nameNo, null, null from table1
    Union
    SELECT distinct null, null, nos, nameNo from table2 
    where exists (select nameNo from table1 where table1.nameNo = table2.nameNo)