【问题标题】:FULL OUTER JOIN without any join conditions没有任何连接条件的 FULL OUTER JOIN
【发布时间】:2026-02-06 00:10:01
【问题描述】:

我有两张桌子

t1:

+--------------+-------------+--------------+
| Product Name |   Issue #   |  Risk Level  |
+--------------+-------------+--------------+
| Product1     | Incident#45 | Risk Level 2 |
| Product2     | Incident#23 | Risk Level 3 |
| Product3     | Incident#98 | Risk Level 1 |
+--------------+-------------+--------------+

t2:

+----------+----------------+
| Org Code | Monthly Output |
+----------+----------------+
|      598 |           2000 |
|      412 |            100 |
|      598 |           2500 |
+----------+----------------+

我想将其组合为“外部连接”来创建:

+--------------+-------------+--------------+----------+----------------+
| Product Name |   Issue #   |  Risk Level  | Org Code | Monthly Output |
+--------------+-------------+--------------+----------+----------------+
| Product1     | Incident#45 | Risk Level 2 | (null)   | (null)         |
| Product2     | Incident#23 | Risk Level 3 | (null)   | (null)         |
| Product3     | Incident#98 | Risk Level 1 | (null)   | (null)         |
| (null)       | (null)      | (null)       | 598      | 2000           |
| (null)       | (null)      | (null)       | 412      | 100            |
| (null)       | (null)      | (null)       | 598      | 2500           |
+--------------+-------------+--------------+----------+----------------+

t1t2 没有类似的专栏可供我加入。有没有办法将这些表连接在一起?

【问题讨论】:

    标签: sql oracle join full-outer-join


    【解决方案1】:

    你可以使用:

    select l1.*, l2.*
    from l1 full join
         l2
         on 1 = 0;   -- never true
    

    【讨论】:

      【解决方案2】:

      您可以在这里很好地使用union all。在我看来,这似乎是对您的问题进行查询的最自然方式。

      它还具有可广泛移植的优点:大多数数据库都支持union all - full join 并非如此,尽管几十年来它是 SQL 标准的一部分,但并非所有主要产品都支持(例如在 MySQL 中)。

      select product_name, issue#, risk_level, null org_code, null monthly_output from t1
      union all
      select null, null, null, org_code, monthly_output from t2
      

      【讨论】:

        【解决方案3】:

        我认为UNION ALLJOIN 更高效,最重要的是,更具可读性。

        SELECT
            ProductName
            , IssueNumber
            , RiskLevel
            , NULL AS OrgCode
            , NULL AS MonthlyOutput
        FROM t1
        
        UNION ALL
        
        SELECT
            NULL AS ProductName
            , NULL AS IssueNumber
            , NULL AS RiskLevel
            , OrgCode
            , MonthlyOutput
        FROM t2
        

        【讨论】: