我有一个带有联合的sql查询若第一个查询中的字段不包含来自列的结果,则我只需要在第二个查询中包含数据

new9mtju  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(257)

我正在处理来自两个系统的数据。系统a是新的,包括所有运输方式。系统b是一个遗留系统,当客户移动到系统a时,数据不会被删除。我在运输业工作,遗留系统处理一种类型的运输,而a包含所有类型的运输。因为有些客户是遗留的,所以我仍然需要这些数据,但是由于所有遗留数据都迁移到了新系统中,所以新系统中的客户会得到重复的数据。
我有一个带有从系统a和b中提取数据的联合的查询。如果第一个查询中的字段=x,我需要创建一个过滤器,它将不包含第二个查询中的任何数据。
前任:

select 
a.customer,
a.carrier,
a.mode,
a.shipmentdate

from NewSystem a

Union

select
b.customer,
b.carrier,
'mode type' as Mode,
b.shipmentdate

from OldSystem b

在第二个查询中,由于没有选择模式,因此我为该列硬编码了一个模式类型。我需要以某种方式证明,如果a=mode类型中的mode,那么就从b中排除结果。我曾尝试对整个查询使用别名并使用case语句,但它似乎没有删除结果。

ldxq2e6h

ldxq2e6h1#

如果没有样本数据,这只是猜测,但我认为你在寻找 WHERE NOT EXISTS .

SELECT 
   a.customer
  ,a.carrier
  ,a.mode
  ,a.shipmentdate
FROM NewSystem AS a

UNION

SELECT 
   b.customer
  ,b.carrier
  ,'mode type' AS Mode
  ,b.shipmentdate
FROM OldSystem AS b
WHERE
  NOT EXISTS 
  (
    SELECT 1
    FROM NewSystem AS ns
    WHERE ns.customer = b.customer
      AND ns.carrier = b.carrier
      AND ns.shipmentdate = b.shipmentdate
      AND ns.mode = 'mode type'
  );

这将只返回第二个数据集中第一个数据集中没有对应行的行。

相关问题