SQL : FULL OUTER JOIN on null columns

标签 sql oracle join outer-join

我想用 FULL OUTER JOIN在几个列的两个表之间,但是当两列都为空时,它们在连接过程中不被视为相等,因此我获得了两个不同的行。我如何编写我的连接,以便将空列视为相等?

我已经建立了一个简化的例子:

create table t1 (
 id number(10) NOT NULL,
 field1 varchar2(50),
 field2 varchar2(50),
 CONSTRAINT t1_pk PRIMARY KEY (id)
);

create table t2 (
  id number(10) NOT NULL,
  field1 varchar2(50),
  field2 varchar2(50),
  extra_field number(1),
  CONSTRAINT t2_pk PRIMARY KEY (id)
);

insert into t1 values(1, 'test', 'test2');
insert into t2 values(1, 'test', 'test2', null);

insert into t1 values(2, 'test1', 'test1');
insert into t2 values(2, 'test1', 'test1', null);

insert into t1 values(3, 'test0', null);
insert into t2 values(3, 'test0', null, 1);

insert into t2 values(4, 'test4', 'test0', 1);

select *
from t1
full outer join t2 using (id, field1, field2);

得到的结果:enter image description here

预期结果:enter image description here

SQLFiddle

最佳答案

使用 NVL()和一个用于替换 NULL 的唯一字符串:

select t1.id,t1.field1,t1.field2,t2.extra_field
from t1
full outer join t2 ON
t1.id=t2.id 
AND NVL(t1.field1,'UID_INSTEAD_OF_NULL')=NVL(t2.field1,'UID_INSTEAD_OF_NULL')
AND NVL(t1.field2,'UID_INSTEAD_OF_NULL')=NVL(t2.field2,'UID_INSTEAD_OF_NULL')

SQLFiddle demo

关于SQL : FULL OUTER JOIN on null columns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32587083/

相关文章:

c# - 在asp.net mvc3 (C#)中执行sql语句

sql - 返回日期范围之间的所有月份和年份 - SQL

mysql - 每当字段为 null(空)时就会触发 Sql

java - CLOB 和 CriteriaQuery

oracle - Oracle pl/sql 电子邮件中的特殊字符

sql - Oracle - 来自单个列的唯一值,但返回其他列

mysql - 创建复杂的 MySQL 查询

具有多个 WHERE 的 MySQL 多个 JOIN 子句

mysql - 使用其他 2 个表的差异创建第 3 个表 SQL

SQL Server 日期时间和 SQL