在sql中合并两个表,包括不常见的字段

0kjbasz6  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(270)

我有两张table如下:

  1. table 1 table 2
  2. id name count1 | id name count2
  3. 1 x 2 1 x 1
  4. 2 y 3 4 y 1
  5. 3 z 1 5 z 2

预期结果:

  1. id name count1 count2
  2. 1 x 2 1
  3. 2 y 3 0
  4. 3 z 1 0
  5. 4 y 0 1
  6. 5 z 0 2

已尝试sql查询:

  1. SELECT table1.id as id, table1.name as name,
  2. table1.count1 as count1, table2.count2 as count2
  3. FROM table1
  4. LEFT JOIN table2 on table1.id = table2.id and table1.name = table2.name

我觉得这是错误的,因为我没有得到预期的结果。因为我是新来的,所以我不确定该使用哪个join。如果您能帮上忙,我们将不胜感激。
非常感谢你

r1wp621o

r1wp621o1#

你可以用 UNION ALL 然后在主查询中聚合为

  1. SELECT id, name, SUM(count1) AS count1, SUM(count2) AS count2
  2. FROM
  3. (
  4. SELECT id, name, count1, 0 AS count2
  5. FROM table1
  6. UNION ALL
  7. SELECT id, name, 0, count2
  8. FROM table2
  9. ) q
  10. GROUP BY id, name
zzoitvuj

zzoitvuj2#

你可以使用 full join :

  1. SELECT COALESCE(t1.id, t2.id) as id, COALESCE(t1.name, t2.name) as name,
  2. COALESCE(t1.count1, 0) as count1, COALESCE(t2.count2, 0) as count2
  3. table1.count1 as count1, table2.count2 as count2
  4. FROM table1 t1 FULL JOIN
  5. table2 t2
  6. ON t1.id = t2.id and t1.name = t2.name;

如果您的数据库不支持 full join ,那么你基本上有两个选择。一个只使用 LEFT JOIN :

  1. SELECT ni.id, ni.name,
  2. COALESCE(t1.count1, 0) as count1, COALESCE(t2.count2, 0) as count2
  3. table1.count1 as count1, table2.count2 as count2
  4. FROM ((SELECT id, name FROM table1
  5. ) UNION -- on purpose to remove duplicates
  6. (SELECT id, name FROM table2
  7. )
  8. ) ni LEFT JOIN
  9. table1 t1
  10. ON t1.id = ni.id AND ni.name = t1.name
  11. table2 t2
  12. ON ni.id = t2.id and ni.name = t2.name;

第二种方法是使用 UNION ALL ,不是 UNION :

  1. SELECT t1.id, t1.name, t1.count1, COALESCE(t2.count2, 0) as count2
  2. FROM table1 t1 LEFT JOIN
  3. table2 t2
  4. ON t1.id = t2.id and t1.name = t2.name
  5. UNION ALL
  6. SELECT t2.id, t2.name, 0, t2.count2
  7. FROM table2 t2 LEFT JOIN
  8. table1 t1
  9. ON t1.id = t2.id and t1.name = t2.name
  10. WHERE t1.id IS NULL;

我不知道“规范”方法在哪里使用 UNION 来自。我认为这是一个关于亲近的思考练习。但是,这是一个非常糟糕的解决方案,原因如下: UNION 增加了删除重复项的额外开销。而这不是 FULL JOIN 功能。
缺乏 WHERE 第二个查询上的子句确保如果存在任何匹配项,则存在重复项。
使用 UNION 删除每个子查询中的重复项。不管是否可取,这都不是问题所在 FULL JOIN 作品。

展开查看全部

相关问题