比较两个唯一记录集并提取缺失记录的ID

时间:2018-01-17 07:25:32

标签: java postgresql salesforce apex soql

在帐户上我有两个与月份和年份有关的对象与帐户的主 - 细节关系。

每月记录每个月的记录。例如USA,GBR,IND ETC

每年都有一次记录捕获美国,GBR,IND等

我们已经确定,我们从数据库中提取的年度记录不匹配,并且正在添加其他一些国家/地区,例如

每月有 - 美国,GBR,IND 每年应该有 - 美国,GBR,IND 但我们有 - 美国,GBR,IND和AUS这是错误的。

我们希望查找具有AUS的记录,然后删除或重新发送信息。

每月和每年的唯一字段

distributor__c =与帐户的主要详细关系

AC_Sponsor_Key__c =国家/经销商ID,在两个对象中都是唯一的

请帮我解决如何解决这种情况

1 个答案:

答案 0 :(得分:2)

您没有指定是否在Salesforce或Postgres中寻找解决方案;)

所以“年度”(可能应该被称为“年度”)相关列表的记录多于“每月”?

您可以在Account上有2个文本字段,其中包含“GBR; IND; USA”等值,然后只需比较两者(排序以获得最佳结果)。您可以使用触发器或直接从源系统填充它们。

失败 - 这应该会给你一些想法。您可能必须在帐户上放置一些过滤器来限制结果集。或者从这段代码片段中创建批处理作业?

List<Account> accs = [SELECT Id, Name
    FROM Account
    WHERE Id IN (SELECT Distributor__c FROM Monthly__c)
        AND Id IN (SELECT Distributor__c FROM Yearly__c)
    ORDER BY Name
    LIMIT 1000];

Set<String> keys = new Set<String>();

for(Monthly__c m : [SELECT AC_Sponsor_Key__c
    FROM Monthly__c
    WHERE Distributor__c IN :accs AND AC_Sponsor_Key__c != null]){
    keys.add(m.AC_Sponsor_Key__c);
}

for(Yearly__c y : [SELECT Id, Distributor__c, AC_Sponsor_Key__c
    FROM Yearly__c
    WHERE Distributor__c IN :accs AND NOT IN :keys
    ORDER BY Distributor__c, AC_Sponsor_Key__c]){
    System.debug(y);
}

或者你可以尝试这样的东西(纯SOQL /报告,没有Apex)。你必须为每个国家运行它。

SELECT Id, Name,
    (SELECT Id FROM Yearlys__r WHERE Country__c = 'AUS')
FROM Account
WHERE Id IN (SELECT Distributor__c FROM Yearly__c WHERE Country__c = 'AUS')
AND Id NOT IN (SELECT Distributor__c FROM Monthly__c WHERE Country__c = 'AUS')

SELECT Id, Distributor__c, Distributor__r.Name
FROM Yearly__c
WHERE Country__c = 'AUS'
AND Distributor__c NOT IN (SELECT Distributor__c FROM Monthly__c WHERE Country__c = 'AUS')

展望未来你可以考虑一些保护措施,“你不能在这个国家插入每年一次,因为没有匹配的月刊”。你可以在insert trigger之前完成它,但也有一个无代码的解决方案。检查VLOOKUP功能以及如何在验证规则中使用它。但是它要求你为每月记录提供唯一的匹配Name值,而我不知道你在那里有什么,可能是一些无用的自动编号...