【问题标题】:SQL Server: Query to get table incremental updatesSQL Server:查询以获取表增量更新
【发布时间】: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


【解决方案1】:

看看EXCEPT,看看它是否符合您的需求

SELECT *
FROM t1
EXCEPT 
SELECT *
FROM t2  

输出:

Host    location    OS 
--------------------------------
Host3   Location3   Solaris 
Host4   Location4   Windows

【讨论】:

  • 这很好用,但只是想测试其他用例。感谢您的宝贵时间
【解决方案2】:
SELECT distinct t1.Host, t1.location, t1.OS
FROM t1
LEFT JOIN t2 ON 
   t1.Host = 2.Host AND
   COALESCE(t1.location,'<<null>>') = COALESCE(t2.location,'<<null>>') AND 
   t1.OS = t2.OS
WHERE COALESCE(t2.Host,t2.location,t2.OS) is null

会给你t1而不是t2

SELECT distinct t2.Host, t2.location, t2.OS
FROM t2
LEFT JOIN t1 ON t1.Host = t2.Host AND t1.location = t2.location AND t1.OS = t2.OS
WHERE COALESCE(t1.Host,t1.location,t1.OS) is null

会给你t2而不是t1

【讨论】:

  • 感谢您的宝贵时间。当我执行第一个查询时,我得到了错误 - 在预期条件的上下文中指定的非布尔类型的表达式,靠近“,”。不知道我到底有没有什么问题。
  • @Hogan 它没有。
  • @TabAlleman -- 他们应该解决这个问题 -- 好多了...被 DB2 宠坏了
  • @Hogan 我仍然得到 Host5,它在两个表中完全相同:(
  • 不要将它用于非字符串列:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
相关资源
最近更新 更多