# SOQL Relationship Query Guide

Complete reference for querying related records in Salesforce.

## Relationship Types

### 1. Parent-to-Child (Subquery)

Returns parent records with nested child records.

```sql
SELECT Id, Name,
    (SELECT Id, FirstName, LastName FROM Contacts)
FROM Account
WHERE Industry = 'Technology'
```

**Key Points:**

- Maximum 20 subqueries per query
- Use relationship name (plural): `Contacts`, `Opportunities`, `Cases`
- For custom objects: `Child_Object__r`

### 2. Child-to-Parent (Dot Notation)

Access parent fields from child record.

```sql
SELECT Id, Name,
    Account.Name,
    Account.Industry,
    Account.Owner.Name
FROM Contact
WHERE Account.Type = 'Customer'
```

**Key Points:**

- Maximum 5 levels deep
- Standard: `Account.Name`
- Custom: `Parent__r.Name`

### 3. Polymorphic (TYPEOF)

Handle fields that reference multiple object types.

```sql
SELECT Id, Subject,
    TYPEOF Who
        WHEN Contact THEN FirstName, LastName
        WHEN Lead THEN Company
    END,
    TYPEOF What
        WHEN Account THEN Name, Industry
        WHEN Opportunity THEN Amount
    END
FROM Task
```

**Common Polymorphic Fields:**

- `WhoId` → Contact, Lead
- `WhatId` → Account, Opportunity, Case, etc.
- `OwnerId` → User, Queue

## Relationship Names

| Child Object | Parent Field | Relationship Name     |
| ------------ | ------------ | --------------------- |
| Contact      | AccountId    | Account.Contacts      |
| Opportunity  | AccountId    | Account.Opportunities |
| Case         | AccountId    | Account.Cases         |
| Task         | WhatId       | Account.Tasks         |
| Contact      | ReportsToId  | Contact.ReportsTo     |

## Limits

| Limit                 | Value               |
| --------------------- | ------------------- |
| Child-to-Parent depth | 5 levels            |
| Subqueries per query  | 20                  |
| Rows per subquery     | 200 (without LIMIT) |

## Best Practices

1. **Use indexed fields** in WHERE clauses
2. **Add LIMIT** to subqueries
3. **Filter early** - push conditions into subqueries
4. **Avoid N+1** - use relationship queries instead of loops
