Redshift:FULL JOIN 忽略右表的 NULL

Posted

技术标签:

【中文标题】Redshift:FULL JOIN 忽略右表的 NULL【英文标题】:Redshift: FULL JOIN leaving out NULLs for right table 【发布时间】:2020-08-05 14:33:19 【问题描述】:

我有一个这样的Table1

ID |   Name   | Occupation
----------------------------
 1 | Garfield | Student

另一个Table 2 是这样的:

ID |   Name   | Occupation
----------------------------
 1 | Garfield | Stud

我的预期输出是这样的:

Table1.ID |   Table1.Name   | Table1.Occupation | Table2.ID |   Table2.Name   | Table2.Occupation
---------------------------------------------------------------------------------------------------
 1        | Garfield        | Student           | NULL      |      NULL       |  NULL
NULL      | NULL            | NULL              | 1         |   Garfield      |  Stud

我的查询是:

SELECT *
FROM table1 t1
FULL JOIN table2 t2
ON t1.id = t2.id
AND t1.name = t2.name
AND (t1.occupation ILIKE ('%' || t2.occupation || '%') OR t2.occupation ILIKE ('%' || t1.occupation || '%'))
;

但是这个查询给了我以下输出:

Table1.ID |   Table1.Name   | Table1.Occupation | Table2.ID |   Table2.Name   | Table2.Occupation
---------------------------------------------------------------------------------------------------
 1        | Garfield        | Student           | NULL      |      NULL       |  NULL

我哪里出错了?有人可以帮忙解决这个问题吗?

【问题讨论】:

@asantz96: ILIKE 不是 LIKE 的“对立面”,它是不区分大小写的LIKE @Garfield 。 . .你的结果有问题。您应该在结果集中至少看到两个表中的所有行。 【参考方案1】:

问题出在JOIN 的最后一部分。将最后一部分移至WHERE 子句。

试试这个查询:

SELECT *
FROM table1 t1
FULL JOIN table2 t2
ON t1.id = t2.id
AND t1.name = t2.name
WHERE (t1.occupation ILIKE ('%' || t2.occupation || '%') OR t2.occupation ILIKE ('%' || t1.occupation || '%'));

注意:如果 Id 是 主键,您可以省略 JOIN 的第二个子句:

SELECT *
FROM table1 t1
FULL JOIN table2 t2
ON t1.id = t2.id
WHERE (t1.occupation ILIKE ('%' || t2.occupation || '%') OR t2.occupation ILIKE ('%' || t1.occupation || '%'));

【讨论】:

以上是关于Redshift:FULL JOIN 忽略右表的 NULL的主要内容,如果未能解决你的问题,请参考以下文章

Redshift:将 FULL OUTER 替换为 CROSS JOIN

MySQL # left join 语句,对右表的限制条件使用注意问题

mybatis怎么实现 FULL JOIN?

SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)

仅当右表为空时,LEFT JOIN 才返回左表的第一行

SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)