如何在APEX SOQL查询中仅显示包含相同字段值的一条记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在APEX SOQL查询中仅显示包含相同字段值的一条记录相关的知识,希望对你有一定的参考价值。

不确定问这个的最好方法。但基本上我对学生在中期提交的教师进行了一项调查。每个调查提交当然是一个不同的记录,但教师和班级将是相同的。查询结果时,我只想显示该教师和班级的一条记录,而不是来自同一教师和班级的多条记录。这是一个例子:

//Instrustor        //Registered Course
Becky Gosky         English Composition                                         
Bobbie Strother     Developmental Psychology                                            
Bobbie Strother     Anatomy & Physiology                                            
Bruce Priddy        Developmental Psychology                                            
Christy Saladino    Developmental Psychology                                            
Christy Saladino    Developmental Psychology                                            
Christy Saladino    Developmental Psychology                                            
Christy Saladino    NCLEX Preparation

正如你所看到的,Bobbie在发展心理学以及解剖学和生理学课程中教授了一门课程 - 他还收到了每个学生的调查评论。

Bruce Priddy也教授发展心理学。

克里斯蒂也教授发展心理学,并收到3份调查评论,所有3条记录都可见。我只想输出一个记录,而不是多个具有相同教师姓名和注册课程的记录。之所以报告用户能力。我想在一个包装类中添加特定教师和特定课程的总响应计数。

我尝试使用集合,地图,包装等...但问题是教师的名字将被使用不止一次,课程也将如此。所以一套不会有帮助。除非我创建一个列表,否则将该集添加到新列表中,然后创建条件语句并仅在满足条件时添加到列表中。这种方式看起来很有希望,但我还没能完全发挥作用。主要是因为有时候指导者和课程都在集合中,所以我不能再创造一个条件。我确信如果指定的字段名称相同,则必须有一种简单的方法来只输出一次记录。我似乎无法找到办法。所以我正在接触我的社区。这是我正在使用的方法:

    public list<wrapper> getlistWrap(){
            wrap = new list<wrapper>();
            listSurveyData = new list<End_Of_Class_Survey__c>([SELECT Id,Question_1_Mid_Survey__c,Question_1B_Mid_Survey__c,Question_1A_MidSurvey__c,Instructor__c,Registered_Course__c from End_Of_Class_Survey__c ORDER BY Instructor__c]);
            listInstructors = new list<Instructor__c>([SELECT Id, Name FROM Instructor__c]);
            listClassName = new list<string>();
            instructorName = new list<string>(); 
            getClassName  = new set<string>();
            getInstructorName = new set<string>();
            count = 0;
            for(integer i = 0; listSurveyData.size() > i; i++){
                if(listSurveyData[i].Instructor__c != '' && listSurveyData[i].Instructor__c != null && listSurveyData[i].Registered_Course__c != '' && listSurveyData[i].Registered_Course__c != null ){
                     instructorName.add(listSurveyData[i].Instructor__c);
                     listClassName.add(listSurveyData[i].Registered_Course__c);
                } 
            }
            system.debug('***********listClassName:' + listClassName);
            system.debug('***********instructorName:' + instructorName);   
            for(count = 0; listClassName.size() > count; count++ ){
                wrap.add(new wrapper(instructorName[count], listClassName[count]));  
            }

            return wrap;

}
答案

我相信您的问题可以通过使用Map并在地图中使用Instructor和Course作为Key的组合来解决。

就像是

Map <String, SurveyResult> newMap = new Map <String, SurveyResult>();
for (SurveyResult k : [Select Instructor,CourseName,Score from SurverResult])
{ String x = k.Instructor + k.CourseName;
newMap.put(x,k);
}
另一答案

我在这里看到几个选项,试验一下,如果需要的话 - 编辑你的问题?应该给你一些想法......

我假设End_Of_Class_Survey__c.Instructor__c是一个查找,但End_Of_Class_Survey__c.Registered_Course__c只是一个文本字段,而不是查找?没关系,但仍然 - 如果不是这种情况,你可能想稍微调整一下。

使用SOQL 100%解决它

与此类似的查询应该非常接近你所追求的

SELECT Instructor__r.Name, Registered_Course__c, COUNT(Id)
FROM End_Of_Class_Survey__c
GROUP BY Instructor__r.Name, Registered_Course__c
ORDER BY Instructor__r.Name, Registered_Course__c
LIMIT 200

问题在于“可能有多少种组合”。除非你向它添加一些WHERE过滤器,我认为大约2K个不同的组合Salesforce会抱怨(“AggregateResult不支持queryMore”)。

(不确定你是否真的需要知道每个老师和班级的调查次数?我以为你只是“这位老师有3门课程”)

用SOQL部分解决它

您应该能够创建关系查询(如果您熟悉正常数据库中的概念,则为JOIN)以获取标题(讲师)+相关的调查列表。

SELECT Id, Name,
    (SELECT Registered_Course__c FROM End_Of_Class_Surveys__r)
FROM Instructor__c

(你需要检查关系的确切名称。再次 - 我没有包含任何WHERE语句,甚至没有“跳过没有任何调查的教师”)

那么这样的事情呢?

for(Instructor__c i : [My SELECT statement ...]){
    Set<String> courses = new Set<String>();
    for(End_Of_Class_Survey__c s : i.End_Of_Class_Surveys__r){
        courses.add(Registered_Course__c); 
    }
    System.debug(i.Name + ' has ' + courses.size() + ' unique courses: ' + courses);
}

我认为如果教师对他/她的名字进行了大量的调查,这个解决方案可能会有一些小问题......再次 - 想想WHERE条款。

蛮力顶点

这个概念介于我的第2节和你在问题中的目的之间。它应该可以很好地适用于您的SOQL行限制(正常上下文为50K,如果您将页面标记为只读,则最多为100万)。它也是LIMIT子句最容易应用的地方,以确保它不会爆炸* ...但不使用具有关系的查询不是非常的salesforce-y方式。

我将把结果扔进一个Map,其中key是教师的id(如果你想要的话,可以输入Name),值是这个教师的(唯一)课程名称的Set

Map<Id, Set<String>> instructorsAndCourses = new Map<Id, Set<String>>();
for(End_Of_Class_Survey__c s : [SELECT Instructor__c, Registered_Course__c
FROM End_Of_Class_Survey__c
LIMIT 50000]){
    if(instructorsAndCourses.containsKey(s.Instructor__c)){
        instructorsAndCourses.get(s.Instructor__c).add(s.Registered_Course__c);
    } else {
        instructorsAndCourses.put(s.Instructor__c, new Set<String>{s.Registered_Course__c});
    }
}
System.debug(JSON.serializePretty(instructorsAndCourses));
  • 你是否希望页面爆炸时出现明显错误或显示效果不佳但未完成的结果是我无法为你决定的:)

以上是关于如何在APEX SOQL查询中仅显示包含相同字段值的一条记录的主要内容,如果未能解决你的问题,请参考以下文章

在 oracle apex 20 中仅显示表中显示来自 LOV 的显示值而不是 id

如何将 SQL 查询中一个字段的值用于 Oracle Apex 上另一个字段的值列表?

iframe 问题:Salesforce 未在 SOQL 嵌套查询中获取父级

在访问查询中仅显示具有特定字段数据的最后一条记录

通过Salesforce中的SOQL查询获取选项列表值

APEX初步 [3] —— Apex触发器