仅在可合并连接的连接条件下才支持 FULL JOIN

Cri*_*ber 5 sql amazon-redshift

我有两个 Redshift 表,它们根据特定日期范围内的 ID 和日期进行连接。

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

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

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

表格1:

  • ID
  • 科尔克斯(日期)

表2:

  • ID
  • 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
      )  
 ;
Run Code Online (Sandbox Code Playgroud)

第二种替代连接:(根据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
;
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

使用重写可以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;
Run Code Online (Sandbox Code Playgroud)

  • @克里伯。。。否。第一个子查询返回“t1”中的所有行,无论“t2”中是否存在匹配行。第二个仅返回“t2”中与“t1”不匹配的行。 (2认同)