【问题标题】:SQL query Help with OUTER JOIN?SQL 查询 OUTER JOIN 的帮助?
【发布时间】:2010-08-10 09:38:02
【问题描述】:

我有两张这样的桌子。

表1

Column   |       Type       |
---------+------------------+
 cod     | text             |
 value99 | double precision |

表2

Column   |       Type       |
---------+------------------+
 cod     | text             |
 value06 | double precision |

我想加入他们,所以我有类似的东西

Column   |       Type       |
---------+------------------+
 cod     | text             |
 value99 | double precision |
 value06 | double precision |

问题在于并非所有代码都存在于两个表中,因此如果代码不存在于其中一个表中,则它的值应该为空。最后我想要这样的东西

cod      |      value99     |      value06     |
---------+------------------+------------------+
 1       |     10           |       20         |
 2       |     13           |      NULL        |
 3       |     NULL         |        15        |

我认为它不可能使用 LEFT 或 RIGHT JOIN.. 或者它可能是......任何想法?谢谢=)

编辑: 我尝试了 FULL OUTER JOIN 但结果类似于

code    value  code    value
1       10     1    4
2    15     NULL    NULL
NULL NULL 3 36

回答!!!: 我找到了@Tobiasopdenbrouw 的答案:

SELECT test1.code,test1.value,test2.value FROM public.test1 LEFT OUTER JOIN public.test2 ON test1.code=test2.code
UNION
SELECT test2.code,test1.value,test2.value FROM public.test1 RIGHT OUTER JOIN public.test2 ON test1.code=test2.code

【问题讨论】:

    标签: sql outer-join


    【解决方案1】:

    我猜了一下,因为您的问题没有详细描述所需的输出,但您可能需要一个帮助查询,它将为您创建一个包含所有代码的表(UNION 2 SELECT 查询)。然后,此帮助表可以是 LEFT JOINED 到您的 2 个源表)。

    编辑:我自己想到了(FULL)OUTER JOIN 答案,但在字里行间阅读时,我认为这不是 OP 真正需要的。但我当然可能是错的。

    【讨论】:

    • 我宁愿不使用包含所有代码的表格。但似乎完全外连接是答案,但输出给了我两列中的“代码”
    • 你看过 kristof 的回答吗?
    【解决方案2】:

    使用FULL OUTER JOIN

    使用完全外部联接

    保留 通过包括不匹配的信息 a 结果中的不匹配行 加入,使用完全外连接。 SQL 服务器提供完整的外连接 运算符,FULL OUTER JOIN,其中 包括两个表中的所有行, 不管对方是否 表有一个匹配的值。

    考虑 Product 表的连接 和 SalesOrderDetail 表 他们的 ProductID 列。结果 仅显示有销售的产品 对他们的命令。 ISO全外 JOIN 运算符表示所有行 从两个表中都将包含在 结果,无论是否 表中有匹配的数据。

    您可以在 WHERE 子句中包含 全外连接只返回 没有匹配数据的行 桌子之间。以下 查询只返回那些产品 也没有匹配的销售订单 作为那些不是 与产品相匹配(尽管所有 在这种情况下,销售订单是 与产品相匹配)。

    【讨论】:

      【解决方案3】:
      select 
          coalesce(t1.cod, t2.cod)
          ,t1.value99
          ,t2.value06
      from 
          table1 t1 
          full outer join table2 t2 on t1.cod= t2.cod
      

      【讨论】:

        猜你喜欢
        • 2015-01-10
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-20
        相关资源
        最近更新 更多