Sql ase很简单,因为我只需要新的。您知道有什么方法可以修改它,这样我就可以得到一个“已更改”的行,而不是新旧行的配对?再次感谢!我将编辑答案以添加该选项。我将把标志更改为changed,并仅为行提供新数据。(不确定您是否需要能够区分new和changed/m

Sql ase很简单,因为我只需要新的。您知道有什么方法可以修改它,这样我就可以得到一个“已更改”的行,而不是新旧行的配对?再次感谢!我将编辑答案以添加该选项。我将把标志更改为changed,并仅为行提供新数据。(不确定您是否需要能够区分new和changed/m,sql,oracle,Sql,Oracle,ase很简单,因为我只需要新的。您知道有什么方法可以修改它,这样我就可以得到一个“已更改”的行,而不是新旧行的配对?再次感谢!我将编辑答案以添加该选项。我将把标志更改为changed,并仅为行提供新数据。(不确定您是否需要能够区分new和changed/modified/updated)我正在尝试您的更新。我收到一个错误:ORA-00905:缺少关键字00905。00000-“缺少关键字”*原因:*操作:第1行第50列出现错误。对应于“as标志”。有什么想法吗?@TimClotworthy-是的


ase很简单,因为我只需要新的。您知道有什么方法可以修改它,这样我就可以得到一个“已更改”的行,而不是新旧行的配对?再次感谢!我将编辑答案以添加该选项。我将把标志更改为
changed
,并仅为行提供新数据。(不确定您是否需要能够区分
new
changed/modified/updated
)我正在尝试您的更新。我收到一个错误:ORA-00905:缺少关键字00905。00000-“缺少关键字”*原因:*操作:第1行第50列出现错误。对应于“as标志”。有什么想法吗?@TimClotworthy-是的,我又做了一次,我把我们的“结束”这个词放在了案例表达的末尾。很抱歉当我没有测试解决方案的测试数据时,可能会发生这种情况。:-)我现在修好了。如果您发现其他问题,请告诉我。祝你好运对不起,我仍然得到你的上述代码的错误。我把我的代码作为回复贴在了我的帖子上(太多了,无法在评论中发表)。你能看到什么会导致“缺少关键字错误?再次感谢!谢谢。我使用了mathguy的回复,但我非常感谢回复的努力和时间。谢谢。我使用了mathguy的回复,但我非常感谢回复的努力和时间。@Timkloworthy…你应该接受他的回答(即使我确实认为这种方法更简单;)。谢谢。我使用了mathguy的回复,但我非常感谢回复的努力和时间。谢谢。我使用了mathguy的回复,但我非常感谢回复的努力和时间。在LASTNAME之后的第三行末尾缺少逗号
select  *
from    TableA a
        left join TableB b on b.ID = a.ID
where   a.ID is null -- added since yesterday
union
select  *
from    TableA a
        left join TableB b on b.ID = a.ID
where   b.ID is null -- removed since yesterday
union
select  *
from    TableA a
        inner join TableB b on b.ID = a.ID -- restrict to records in both tables
where   a.SomeValue <> b.SomeValue
or      a.SomeOtherValue <> b.SomeOtherValue
--etc
-- added since yesterday
SELECT B.*
FROM TableA A
LEFT Outer Join TableB B on B.ID = A.ID
WHERE A.ID IS NULL

UNION

-- removed since yesterday
SELECT A.*
FROM TableA A
LEFT OUTER JOIN TableB B on B.ID = A.ID
WHERE B.ID IS NULL 

UNION

-- Those changed with values from yesterdady
SELECT B.* FROM TableB B WHERE EXISTS(SELECT A.ID FROM TableA A WHERE A.ID = B.ID) 
EXCEPT
SELECT A.* FROM TableA A WHERE EXISTS(SELECT B.ID FROM TableB B WHERE B.ID = A.ID)
select coalesce(ty.customerid, tt.customerid) as customerid,
      (case when ty.customerid is null then 'New'
            when tt.customerid is null then 'Removed'
            else 'Modified'
       end) as status
from tyesterday ty full outer join
     ttoday tt
     on ty.customerid= tt.customerid
where ty.customerid is null or
      tt.customerid is null or
      (tt.col1 <> ty.col1 or tt.col2 <> ty.col2 or . . . );  -- may need to take `NULL`s into account
select max(flag) as flag, PERSON_ID, first_name, last_name, (etc. - all the columns)
from   ( select 'old' as flag, t1.*
           from old_table t1
         union all
         select 'new' as flag, t2.*
           from new_table t2
       )
group by PERSON_ID, first_name, last_name, (etc.)
having  count(*) = 1
order by PERSON_ID  --     optional
;
with old_table ( person_id, first_name, last_name ) as (
       select 101, 'John', 'Smith' from dual union all
       select 102, 'Mary', 'Green' from dual union all
       select 103, 'July', 'Dobbs' from dual union all
       select 104, 'Will', 'Scott' from dual
     ),
     new_table ( person_id, first_name, last_name ) as (
       select 101, 'Joe' , 'Smith' from dual union all
       select 102, 'Mary', 'Green' from dual union all
       select 104, 'Will', 'Scott' from dual union all
       select 105, 'Andy', 'Brown' from dual
     )
-- end of test data; solution (SQL query) begins below this line
select case ct when 1 then flag else 'changed' end as flag,
       person_id, first_name, last_name
from   (
select max(flag) as flag, person_id, first_name, last_name,
       count(*) over (partition by person_id) as ct,
       row_number() over (partition by person_id order by max(flag)) as rn
from   ( select 'old' as flag, t1.*
           from old_table t1
         union all
         select 'new' as flag, t2.*
           from new_table t2
       )
group by person_id, first_name, last_name
having  count(*) = 1
)
where rn = 1
order by person_id   --  ORDER BY clause is optional
;
FLAG     PERSON_ID FIRS_NAME LAST_NAME
------- ---------- --------- ---------
changed        101 Joe       Smith
old            103 July      Dobbs
new            105 Andy      Brown
select case when ct = 1 then flag else 'changed' as flag, PERSON_ID, FIRSTNAME, LASTNAME
from (
   select max(flag), PERSON_ID, FIRSTNAME, LASTNAME
          count() over (partition by PERSON_ID) as ct,
          row_number() over (partition by PERSON_ID 
                             order by case when flag = 'new' then 0 end) as rn
   from   ( select 'old' as flag, t1.*
              from YESTERDAY_TABLE t1
            union all
            select 'new' as flag, t2.*
              from TODAY_TABLE t2
          )
   group by PERSON_ID, FIRSTNAME, LASTNAME
          having  count(*) = 1
 )
where rn = 1
order by PERSON_ID;