When Comparing Fields From Two Different Tables, How To Resolve This Error?

962    Asked by Aashishchaursiya in Salesforce , Asked on May 11, 2023

I'm trying to show all the leads that have the same DUNS number like the record i'm currently on (account)

Select l.Name, l.Email, l.CompanyDunsNumber,l.Status From Lead l WHERE CompanyDunsNumber = (Select a.DunsNumber From Account a Where Id='0015E00000CsMZXQA3')

and i receive the error: Bind Variables only allowed in Apex Code

Answered by Clare Matthews

You are seeing this error - Bind Variables only allowed in Apex Code due to the field to field comparison in WHERE clause of SOQL.

I am not sure how you are obtaining the current Account Id but I am providing an example with this Id hardcoded (you should move away from this approach within your design) for you to move forward with. Let's start with creating a collection of Ids to store our found "Matching" Leads (based on DunsNumer). You will need to iterate over the Account(s) (plural once you have redesigned to pass in a List of Account Ids to work with rather than the single hardocded Id) and then for each Account we can query the Leads that match on DunsNumber.

      List leadsWithMatchingDUNS = new List(); for (Account acc : [select DunsNumber from Account where Id ='0012400000Max8P']) { Lead l = [select id from Lead where CompanyDunsNumber = :acc.DunsNumber]; if (l != null) { leadsWithMatchingDUNS.add(l.Id); } } System.debug(leadsWithMatchingDUNS);

You can follow on with this List of Lead Ids however you choose to do so. I am simply debugging for POC.


Your Answer

Answer (1)

When comparing fields from two different tables, you might encounter various types of errors, especially if there are mismatches in data types, field names, or other constraints. Here are some common issues and how to resolve them:

Common Errors and Solutions

1. Data Type Mismatch

If the fields you are comparing are of different data types, you will likely encounter an error. For example, comparing a string to an integer will cause an error.

Solution: Ensure that both fields are of the same data type. You might need to cast one field to the type of the other.

SELECT *
FROM table1 t1
JOIN table2 t2 ON t1.field1 = CAST(t2.field2 AS VARCHAR);

Or vice versa:

SELECT *
FROM table1 t1
JOIN table2 t2 ON CAST(t1.field1 AS INTEGER) = t2.field2;

2. Null Values

Null values can cause issues when comparing fields because NULL is not equal to anything, including another NULL.


Solution: Handle NULL values explicitly in your comparison.

SELECT *
FROM table1 t1
JOIN table2 t2 ON COALESCE(t1.field1, '') = COALESCE(t2.field2, '');

3. Case Sensitivity

String comparisons might be case-sensitive depending on your database collation settings.

Solution: Use functions to handle case-insensitive comparisons if needed.

SELECT *
FROM table1 t1
JOIN table2 t2 ON LOWER(t1.field1) = LOWER(t2.field2);

4. Field Name Conflicts

If both tables have fields with the same name and you are performing a JOIN, you need to qualify the field names with the table names or aliases.

Solution: Use table aliases to distinguish between fields from different tables.

SELECT t1.field1, t2.field2
FROM table1 t1
JOIN table2 t2 ON t1.field1 = t2.field2;

General Steps to Troubleshoot and Resolve Errors

Check Field Names: Ensure that you are using the correct field names and table aliases.

Verify Data Types: Make sure that the fields being compared are of compatible data types. Use casting if necessary.

Handle Null Values: Use functions like COALESCE to handle NULL values explicitly.

Ensure Consistent Case: For string comparisons, consider using LOWER or UPPER to ensure case consistency.

Review Error Messages: Carefully read any error messages provided by your database system. They often give clues about what is wrong.

Example Query

Here is an example query that joins two tables and compares fields, addressing common issues:

SELECT t1.id, t1.name, t2.value
FROM table1 t1
JOIN table2 t2
    ON CAST(t1.id AS VARCHAR) = t2.id
    AND COALESCE(LOWER(t1.name), '') = COALESCE(LOWER(t2.name), '');

In this query:

CAST(t1.id AS VARCHAR) ensures that id fields are of the same type.
COALESCE(LOWER(t1.name), '') = COALESCE(LOWER(t2.name), '') handles NULL values and ensures case-insensitive comparison for the name fields.

By following these guidelines, you can resolve errors when comparing fields from different tables in SQL.







6 Months

Interviews

Parent Categories