您如何比较多个表中的记录但查找不同或缺失的值

Posted

技术标签:

【中文标题】您如何比较多个表中的记录但查找不同或缺失的值【英文标题】:How do you compare records within the multiple tables but look for different or missing values 【发布时间】:2014-04-08 22:41:55 【问题描述】:

这是我的表格的一个版本:

p.productid | pp.productid|  pp.productpricingid | p.erpsku | pp.countrycode | pp.productstatus
 1            1                    1             AAAAA        US             Active
 2            2                    2             BBBBB        US             Active
 3            3                    3             CCCCC        US             Active
 4            4                    4             DDDDD        US             Active

 1            1                    5             AAAAA        CA             Active
 2            2                    6             BBBBB        CA             Active
 3            3                    7             CCCCC        CA             InActive

所以我有 2 表产品和产品定价。我需要帮助编写一个查询,该查询将提取所有在美国处于活动状态但在 CA 中处于非活动状态或不存在的值。因此,对于上面的示例,应该提取 valeus CCCCC 和 DDDDD。棘手的是,所有这些数据都存在于产品和产品定价表中,我将它们组合成一个数据集。然后在该数据集中,我必须编写另一个嵌套查询,在其中找到所有差异。现在我可以找到所有不在 US 表中的值,但我不确定这个查询是否准确。

这是我的查询示例:

select p.erpsku from

product p, productpricing pp

where

p.productid = pp.productid

and pp.countrycode = 'us'

and pp.productstatus = 'Active'

and p.productid not in (select p.productid from product p, productpricing pp where p.productid = pp. productid and 

pp.countrycode = 'CA' )

但是我不确定这个查询是否准确。对此我能得到任何帮助,我将不胜感激。

【问题讨论】:

在您的 CA 子选择中,如果您可以拥有国家代码为“CA”且产品状态为'无效'。 谷歌sql join find missing records 嗨 Danny,我将子选择中的状态更改为非活动状态,但是返回值是美国列表中存在但 CA 列表中不存在的所有 sku。我需要找到 sku 在 us 列表中存在并处于活动状态但在 CA 列表中存在且 INACTIVE 的值。这有意义吗? @user3512974 - 是的,但是您想要子选择检查'Active',因为您正在检查 p.productd 不在子选择中的位置。 【参考方案1】:

如果您包含 Danny 的建议,那么您就对了。也许如果您将查询构造为CTE,解决方案对您来说会变得更加明显?

create table #DataTable (
     erpsku varchar(20)
    ,countrycode char(2)
    ,productstatus varchar(8)
);


insert #DataTable
values
     ('AAAAA', 'US', 'Active')
    ,('BBBBB', 'US', 'Active')
    ,('CCCCC', 'US', 'Active')
    ,('DDDDD', 'US', 'Active');

-- All regions' data in one table
insert #DataTable
values
     ('AAAAA', 'CA', 'Active')
    ,('BBBBB', 'CA', 'Active')
    ,('CCCCC', 'CA', 'InActive');


;with US_Active as
(
    select
        erpsku
    from #DataTable
    where countrycode = 'US'
    and productstatus = 'Active'
)
, CA_Active as
(
    select
        erpsku
    from #DataTable
    where countrycode = 'CA'
    and productstatus = 'Active'
)
, US_Not_CA as
(
    select
        erpsku
    from US_Active
    EXCEPT
    select
        erpsku
    from CA_Active
)
select * from US_Not_CA;

为简单起见,我对您的示例表进行了缩写。我在 erpsku 上所做的事情也可以在 ProdustID 上完成。

【讨论】:

以上是关于您如何比较多个表中的记录但查找不同或缺失的值的主要内容,如果未能解决你的问题,请参考以下文章

如何从日期范围查询中查找表中的一组缺失日期

如何查找内容表 SQL 中的差异

Netezza SQL 比较同一表中的两条记录

如何比较同一个表中的多行并用不同的值标记它们?

如何在sql表中查找缺失的元素

rethinkdb - hasFields 查找具有多个多个缺失条件的所有文档