这是我的样本表:
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 |
+-----+--------+------+--------+
答案 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)