【问题标题】:FULL JOIN is only supported with merge-joinable join conditionsFULL JOIN 仅支持可合并连接的连接条件
【发布时间】:2020-07-03 09:02:46
【问题描述】:

我有两个 Redshift 表,它们在特定日期范围内的 id 和日期上加入。

当我尝试对表进行完全外部联接时(下面的两个替代 SQL 语句),我收到以下错误:

[Amazon](500310) Invalid operation: FULL JOIN is only supported with merge-joinable join conditions; [SQL State=0A000, DB Errorcode=500310]

它适用于 LEFT-JOIN,但不适用于 FULL-OUTER。我基本上希望在其中包含所有 id 和范围,即使另一个表中没有匹配项。 我该如何解决这个错误?

表 1:

  • 身份证
  • colx(日期)

表 2:

  • 身份证
  • col2(日期范围开始)
  • col3(日期范围结束)
  • 某事

第一个替代连接:

SELECT *
FROM table1 
  FULL OUTER JOIN table2
      ON (table1.id = ltrim(table2.id, '0') -- id
      AND DATE(table1.colx) BETWEEN DATE(table2.col2) AND DATE(table2.col3) -- date range
      )  
 ;

第二个替代连接:(根据 AWS 文档,范围包括在内,所以语句应该有相同的结果我想)

SELECT *
FROM table1 
  FULL OUTER JOIN table2
      ON table1.id = ltrim(table2.id, '0') -- id
      AND DATE(table1.colx) >= table2.col2  -- date range beginning
      AND DATE(table1.colx) <= table2.col3  -- date range ending
;

【问题讨论】:

    标签: sql amazon-redshift


    【解决方案1】:

    使用union all 重写它可以解决问题吗?

    SELECT t1.*, t2.*
    FROM table1 t1 LEFT JOIN
         table2 t2
         ON t1.id = ltrim(t2.id, '0') AND 
            DATE(t1.colx) BETWEEN DATE(t2.col2) AND DATE(t2.col3)
    UNION ALL
    SELECT t1.*, t2.*
    FROM table2 t2 LEFT JOIN
         table1 t1
         ON t1.id = ltrim(t2.id, '0') AND
            DATE(t1.colx) BETWEEN DATE(t2.col2) AND DATE(t2.col3)
    WHERE t1.id IS NULL;
    

    【讨论】:

    • 我不会从 'UNION ALL' 获得两侧存在的所有行的重复行吗?在它周围做一个“SELECT DISTINCT FROM ()”可能会解决它,但它相当难看......
    • @Cribber 。 . .否。第一个子查询返回t1 中的所有行,无论t2 中是否有匹配的行。第二个仅返回 t2 中与 t1 不匹配的行。
    猜你喜欢
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2018-05-23
    相关资源
    最近更新 更多