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

时间:2017-12-30 15:53:32

标签: salesforce 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;

}

2 个答案:

答案 0 :(得分:0)

我相信您的问题可以通过使用地图并在地图中使用讲师和课程组合键来解决。

这样的东西
def mongodbCdrSource(collection : Future[BSONCollection],mat: ActorMaterializer): Source[RandomCdr,Future[State]]= {
    implicit val materializer = mat
    implicit val executionContext = materializer.executionContext

    val zoneId = ZoneId.systemDefault
    val day = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).atZone(zoneId).toEpochSecond()*1000L
    val selector = BSONDocument("dateTime" -> BSONDocument("$gt" -> day))
    Await.result(collection,5.second).find(selector).cursor[RandomCdr](ReadPreference.nearest).documentSource()
}

答案 1 :(得分:0)

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

我假设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

问题是&#34;可能有多少组合&#34;。除非你向它添加一些WHERE过滤器,否则我认为Salesforce会抱怨大约2K个不同的组合(&#34; AggregateResult不支持queryMore &#34;)。

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

使用SOQL进行部分解决

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

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

(你需要查看关系的确切名称。再次 - 我没有包含任何WHERE语句,甚至不包括#34;跳过没有&#39;还有任何调查&#34;)

然后是这样的?

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条款最容易应用的地方,以确保它不会爆炸* ...但不使用具有关系的查询不是非常有销售力的方式。

我将结果投入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));
  • 您是否希望页面爆炸时出现明显错误或显示效果,但未完成结果是我无法为您决定的事情:)