【发布时间】:2016-12-29 19:33:44
【问题描述】:
我有一张表,我需要知道从前一天到今天更新了哪些数据。假设前几天的数据在 t1 中,当天数据在 t2 中,我尝试在所有列上执行“t1 FULL OUTER JOIN t2”(因为我需要获取整个表的更新,而不管任何列),其中 t2 的每一列都是 NULL .
问题是,如果 t1 中的一行在其任何列中都有空值,即使 t2 中的行保持不变,它也会导致输出,这是我不想要的。这是我的情况的一个例子。
create table t1(Host varchar(20), location varchar(20), OS varchar(20))
create table t2(Host varchar(20), location varchar(20), OS varchar(20))
insert into t1 (Host,location,OS)
values ('Host1','Location1','Linux'),
('Host2','Location2','Unix'),
('Host3','Location3','Solaris'),
('Host4','Location4','Windows'),
('Host5',null,'linux') ---> Host5 remains same in both tables
insert into t2 (Host,location,OS)
values ('Host1','Location1','Linux'),
('Host2','Location2','Unix'),
('Host3','Location3','Windows'),
('Host4','Location7','Windows'),
('Host5',null,'linux') ---> Host5 remains same in both tables
查询:
SELECT distinct t1.Host, t1.location, t1.OS
FROM t1 FULL OUTER JOIN
t2 ON t1.Host = t2.Host
AND t1.location = t2.location
AND t1.OS = t2.OS
WHERE (t2.Host IS NULL) OR
(t2.location IS NULL) OR
(t2.OS IS NULL)
输出是:
主机位置 操作系统 -------------------------- 空 空 空 主机 3 位置 3 Solaris 主机 4 位置 4 窗口 Host5 NULL linux在预期结果中,需要删除 Host5,因为两个表中都存在同一行。
我知道这是由于 FULL OUTER JOIN 的性质与 WHERE 条件和数据中的 NULL 值。只是想知道是否有任何替代方法可以仅获取更新的记录。
【问题讨论】:
-
你想要一个左连接而不是一个完整的外连接。
标签: sql-server null full-outer-join