在 where 子句中合并删除太多行

Coalesce in where clause removing too many rows

我有两个表,每个表都包含相同的字段,但来自两个不同的数据输入系统,我使用 UNION 连接它们,因此没有真正的重复记录。但是,在两个系统上输入的一些记录的数据略有不同,我需要删除在一个系统上输入空值但在另一个系统上输入值的行 - 我使用了 COALESCE 并且在 99% 的情况下这已经完美地工作了。问题是有两行都有真正的空值(示例数据见下文):

PersonID    Location1   Location2           Date
1           NULL            NULL            2016-05-01
1           NULL            NULL            2014-10-01
1           Home            Home            2016-05-01

2           HospitalA       HospitalB       2016-07-23
2           NULL            NULL            2016-07-23

3           HospitalA       HospitalA       2014-12-19
3           HospitalB       HospitalB       2016-08-16

如果日期相同,我只想要包含位置值的行,但如果日期不同,我希望每个日期对应一行,即使其中一个日期的位置为 NULL - PersonID 1 有两行,一个日期为 2014-10-01 的 NULL 位置和一个日期为 2016-05-01 的位置; PersonID 2 有一行,位置日期为 2016-07-23,PersonID 3 有两行,位置和日期都不同。

我使用的查询是

select *
from 
(select PersonID, Location1, Location2, Date
from tablea
union
select PersonID, Location1, Location2, Date
from tableb) as PID
where Location1 = coalesce(Location1,'')

提前感谢任何指点

问题是UNION依次列出了两个table的内容,所以每一行只有原来table的字段。这意味着 where Location1 = coalesce(Location1,'') 正在针对自身检查一个字段。

要实现您想要的效果,您可能需要对 UNION

的结果进行汇总
select  PersonID, max(Location1), max(Location2), Date
from    (
          select  PersonID, Location1, Location2, Date
          from    tablea
          union all
          select  PersonID, Location1, Location2, Date
          from tableb
        ) as PID
group by PersonID, Date

您似乎想要将 COALESCE 用作 GROUP BY 中的聚合运算符:

SELECT PersonID、日期、合并(位置 1)、合并(位置 2) 从你的工会这里 按 PersonID、日期分组

但是不知道SQL这种聚合函数形式是否支持COALESCE

即使它确实有效,你仍然需要仔细检查如果某人在同一天有两个不同的位置会发生什么(COALESCE 必然只保留其中一个)。

每个人和日期一行转换为 GROUP BY person, date in SQL。

select 
  personid, 
  max(location1) as location1,
  max(location2) as location2,
  date
from 
(
  select personid, location1, location2, date
  from tablea
  union all
  select personid, location1, location2, date
  from tableb
) as pid
group by personid, date;