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 语句,对右表的限制条件使用注意问题
SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)
SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)