【问题标题】:MySQL: FULL OUTER JOIN - How do I merge one column?MySQL:FULL OUTER JOIN - 如何合并一列?
【发布时间】:2011-05-23 20:11:04
【问题描述】:

我有一个关于 MySQL 中的 FULL OUTER JOIN 的问题。我有两张(或更多张桌子):

表 1 表 2 id 值 id 值2 1个1个 2 天 3 天 3 e 4 f

我已使用此查询来获取我的加入:

SELECT * 
FROM table1
LEFT OUTER JOIN table2
ON table1.`id`=table2.`id`
UNION
SELECT * 
FROM table1
RIGHT OUTER JOIN table2
ON table1.`id`=table2.`id`

得到:

标识值 1 标识值 2 1个1个 2 c 空空 3 天 3 天 NULL NULL 4 f

我的问题是我无法同时将两个 id 列折叠成一列来得到这个:

id 值1 值2 1个 2 c 空 3 天 4 空 f

有什么建议吗?

【问题讨论】:

    标签: sql mysql union full-outer-join


    【解决方案1】:
    SELECT 
    COALESCE(t1.id, t2.id) as id,
    t1.value1,
    t2.value2
    FROM table1 t1
    FULL JOIN table2 t2 ON t1.id = t2.id;
    

    【讨论】:

    • 同意.. COALESCE 就是我想要的!
    • 简短而完美的答案!
    【解决方案2】:

    用途:

        SELECT t1.id,
               t1.value,
               t2.value2 
          FROM table1 t1
     LEFT JOIN table2 t2 ON t2.id = t1.id
    UNION
        SELECT t2.id,
               t1.value,
               t2.value2
          FROM TABLE1 t1
    RIGHT JOIN TABLE2 t2 ON t2.id = t1.id
    

    UNION 运算符删除行/记录重复项,因此您必须适当地定义/列出列。

    脚本:

    DROP TABLE IF EXISTS `example`.`table1`;
    CREATE TABLE  `example`.`table1` (
      `id` int(10) unsigned NOT NULL default '0',
      `value` varchar(45) NOT NULL default ''
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    INSERT INTO table1 VALUES (1, 'a'), (2, 'c'), (3, 'e');
    
    DROP TABLE IF EXISTS `example`.`table2`;
    CREATE TABLE  `example`.`table2` (
      `id` int(10) unsigned NOT NULL default '0',
      `value2` varchar(45) NOT NULL default ''
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    INSERT INTO table2 VALUES (1, 'b'), (3, 'd'), (4, 'f');
    

    编辑:上面的固定线

    【讨论】:

    • 非常感谢您提供的非常迅速和有用的回答。这完全解决了我的问题。
    • 如果我必须在 sqlite 上执行此操作怎么办。它支持左连接?
    【解决方案3】:

    对于我认为您正在尝试做的事情,我建议您改用 FULL OUTER JOIN:

    SELECT ISNULL(t1.id, t2.id) AS id, t1.value1, t2.value2
    FROM table1 t1
    FULL OUTER JOIN table2 t2 ON t1.id = t2.id
    

    【讨论】:

    猜你喜欢
    • 2021-11-09
    • 2014-01-07
    • 1970-01-01
    • 2013-03-10
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2015-01-10
    相关资源
    最近更新 更多