结合两个SOQL查询

时间:2013-06-04 09:11:57

标签: sql salesforce soql

我是SOQL的初学者,希望你能帮助我。 我想结合这两个问题:

查询1:

SELECT Id, Category__c, Segment__c
FROM Account
WHERE (Category__c = 'Prospect' AND Segment__c = 'High') OR (Category__c = 'Referrer' AND Segment__c = 'High')

查询2:

SELECT Account_vod__c, WEEK_IN_YEAR(Call_Date_vod__c), CALENDAR_YEAR(Call_Date_vod__c)
FROM Call2_vod__c
WHERE Call_Date_vod__c = LAST_N_WEEKS:7
GROUP BY Account_vod__c, Call_Date_vod__c

其中Account的ID应等于Call2_vod__c中的Account_vod__c值。

当我将这些结合起来时,我会得到一些东西:

综合查询:

SELECT Id, Category__c, Segment__c
FROM Account
WHERE id in (select Account_vod__c from Call2_vod__c where Call_Date_vod__c = LAST_N_WEEKS:7) AND ((Category__c = 'Prospect' AND Segment__c = 'High') OR (Category__c = 'Referrer' AND Segment__c = 'High'))

但现在我错过了周和年的价值观:

WEEK_IN_YEAR(Call_Date_vod__c), CALENDAR_YEAR(Call_Date_vod__c)

和这部分:     GROUP BY Account_vod__c,Call_Date_vod__c

如何组合这些查询并显示正确的周和日历数据?

谢谢!

2 个答案:

答案 0 :(得分:2)

如果您的Account_vod__c是对帐户对象的查找,则可以通过键入Account_vod__r.Name等来获取来自帐户的字段(使用“r”而不是“c”并使用点)。

所以试试这样的事情?

SELECT Account_vod__c, Account_vod__r.Category__c, Account_vod__r.Segment__c, WEEK_IN_YEAR(Call_Date_vod__c), CALENDAR_YEAR(Call_Date_vod__c)
FROM Call2_vod__c
WHERE Call_Date_vod__c = LAST_N_WEEKS:7
GROUP BY Account_vod__c, Account_vod__r.Category__c, Account_vod__r.Segment__c, WEEK_IN_YEAR(Call_Date_vod__c), CALENDAR_YEAR(Call_Date_vod__c)

类似的应该适用于没有对象的每个人:

SELECT AccountId, Account.Name, COUNT(Id) countOfContactsCreatedThatWeek, WEEK_IN_YEAR(CreatedDate) week, CALENDAR_YEAR(CreatedDate) year
FROM Contact
GROUP BY AccountId, Account.Name, WEEK_IN_YEAR(CreatedDate), CALENDAR_YEAR(CreatedDate)

答案 1 :(得分:0)

如果您对使用两个查询没问题,我会从那开始。在您拥有的组合版本中,无论如何,您在技术上都会调用两个查询。 where子句中的内部查询计为针对您的调控器限制的第二个查询。

如果您使用的是Apex,请尝试:

Map<Id, Account> aMap = new Map<Id, Account>([SELECT Id, Category__c, Segment__c
FROM Account
WHERE (Category__c = 'Prospect' AND Segment__c = 'High') OR (Category__c = 'Referrer' AND Segment__c = 'High')]);

List<Call2_vod__c> callList = [SELECT Account_vod__c, WEEK_IN_YEAR(Call_Date_vod__c), CALENDAR_YEAR(Call_Date_vod__c)
FROM Call2_vod__c
WHERE Call_Date_vod__c = LAST_N_WEEKS:7 and Id in :aMap.keySet()
GROUP BY Account_vod__c, Call_Date_vod__c];