我有一个场景,我正在从 MDM 数据库查询“匹配集群”以获取主记录。每个“集群”都有一个特定的编号,在该集群中,您将有一个“主”记录和所有关联的子记录的行/记录。
我们在世界不同地区开展业务,并有一列名为“域”的列,其参考值范围为“1001”到 1010,代表不同的地区/域。到目前为止,我能够成功做到的是,“我想要来自集群中域“1008”所在的所有匹配集群的主记录。看起来如下(“业务合作伙伴类型”严格来说是调用 1001 = 客户和 1002 = 供应商) - 此查询仅获取具有“1008”的任何集群,但不排除其中存在其他域值:
select * from data.vTest
where [Match Cluster] in (select distinct [Match Cluster] from data.vTest
where [Domain] = 1008 and [Match Cluster] is not null and [Business Partner Type] = 1001)
and [Business Partner Type] is null;
上面的内容获取了存在 1008 的任何匹配簇(只是一个示例 - 1001、1002 等的概念相同)。我现在要寻找的是,获取仅存在一个域值的所有集群。示例如下:
然后您将看到以下内容,这是我不想出现的内容 - 任何来自这些“子记录”的域值超过 1 个的匹配集群:
到目前为止我所尝试的方法并没有奏效 - 我得到的最接近的是以下内容,它仍然返回那些包含多个域值的子记录的“主”:
select * from data.vTest
where [Match Cluster] in (select [Match Cluster] from data.vTest
where [Domain] not in (1001,1002,1003,1004,1005,1006,1007,1009,1010) and [Match Cluster] is not null and [Business Partner Type] = 1001)
and [Business Partner Type] is null;
关于编写此查询的最佳方式有什么想法吗?希望这些照片能帮助我回到我想要实现的目标的大局。请注意,我正在拍摄一个示例的快照,但我的想法是我想查看该列中的所有匹配集群并返回我正在查找的所有结果。谢谢!
另一种表达你想要的方式是:
将其转换为 SQL:
这将为您提供您感兴趣的匹配集群。
您可以使用自联接或
IN
子句返回具有这些匹配集群值的行,就像您已经做的那样。还有几种其他方法可以使用
[NOT] EXISTS
窗口函数来表达相同的查询规范。您还可以利用这样一个事实:每组一个不同的项目意味着最小值和最大值必须相同:
为此,请向
HAVING
子句添加另一个谓词:或者
您可以在那里使用任何聚合,因为只有一个匹配值。我选择了
MIN
。需要聚合,因为您要在分组后进行过滤。你同样可以写: