Search code examples
sqlsalesforceinner-joinsoqlin-clause

How to do inner or sub-query for the same object in SOQL


I'm facing an issue to select the value from the same object. I provided the query below.

I'm migrating a Java J2EE application to Salesforce, the below query works in my SQL.
I'm trying to do the same in SOQL, but it doesn't work.

 SELECT DATA1__c, TEXT__c 
     FROM PARAMETERS__c 
     WHERE ( (TYPE__c = 'ADMINISTRATEUR') 
         AND (KEY1__c LIKE 'MONTAGE%') (AND KEY2__c = '')) 
         AND (DATA1__c 
                  IN (SELECT KEY1__c 
                      FROM Parameters__c 
                      WHERE TYPE__c = 'PERE_TECHNIQUE'))

In the above query I need to take the value where TYPE is based on 'TECHNIQUE' where KEY1__c should be matched to DATA1__c from the outer query.

The query is very similar to this example

 SELECT Id 
     FROM Idea 
     WHERE ((Idea.Title LIKE 'Vacation%') 
         AND (CreatedDate > YESTERDAY)  
         AND (Id IN (SELECT ParentId 
                     FROM Vote 
                     WHERE CreatedById = '005x0000000sMgYAAU'))

The only difference is that IN clause is used with a different object. In my query I'm trying to use IN clause from the same object parameters.

Kindly let me know in case of any further clarifications.


Solution

  • try the following

    List<String> pereTechniqueParams = new List<String>();
    for (String key: 
              [SELECT KEY1__c FROM Parameters__c WHERE TYPE__c = 'PERE_TECHNIQUE']) {
        pereTechniqueParams.add(key.KEY1__c);
    }
    
    List<Parameters__c> params = [SELECT DATA1__c, TEXT__c 
                                      FROM PARAMETERS__c 
                                      WHERE (TYPE__c = 'ADMINISTRATEUR' 
                                             AND KEY1__c LIKE 'MONTAGE%' 
                                             AND KEY2__c = '') 
                                          AND DATA1__c IN:pereTechniqueParams];
    

    UPDATE:

    for (Parameters__c key1 : [SELECT KEY1__c 
                        FROM Parameters__c WHERE TYPE__c = 'PERE_TECHNIQUE']) {
        pereTechniqueParams.add(key1.KEY1__c);
    } 
    

    Don't use String use Parameters__c

    public class LookUpController {
        public List<Parameters__c> getParamters() {
            List<String> pereTechniqueParams = new List<String>();
            for (Parameters__c key1 : [SELECT KEY1__c 
                                FROM Parameters__c WHERE TYPE__c = 'PERE_TECHNIQUE']) {
                pereTechniqueParams.add(key1.KEY1__c);
            } 
            List<Parameters__c> params = [SELECT DATA1__c, TEXT__c 
                                   FROM PARAMETERS__c 
                                   WHERE TYPE__c = 'ADMINISTRATEUR' 
                                       AND KEY1__c LIKE 'MONTAGE%' 
                                       AND KEY2__c = '' 
                                       AND Data1__c IN: pereTechniqueParams];
            return params;
        }
    }