mirror of
https://github.com/forcedotcom/afv-library.git
synced 2026-07-30 11:19:27 +08:00
209 lines
4.5 KiB
Markdown
209 lines
4.5 KiB
Markdown
|
|
<!-- Parent: platform-soql-query/SKILL.md -->
|
||
|
|
|
||
|
|
# SOQL Syntax Reference
|
||
|
|
|
||
|
|
## Basic Query Structure
|
||
|
|
|
||
|
|
```sql
|
||
|
|
SELECT field1, field2, ...
|
||
|
|
FROM ObjectName
|
||
|
|
WHERE condition1 AND condition2
|
||
|
|
ORDER BY field1 ASC/DESC
|
||
|
|
LIMIT number
|
||
|
|
OFFSET number
|
||
|
|
```
|
||
|
|
|
||
|
|
### Field Selection
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Specific fields (recommended)
|
||
|
|
SELECT Id, Name, Industry FROM Account
|
||
|
|
|
||
|
|
-- All fields (avoid in Apex - use only in Developer Console)
|
||
|
|
SELECT FIELDS(ALL) FROM Account LIMIT 200
|
||
|
|
|
||
|
|
-- Standard fields only
|
||
|
|
SELECT FIELDS(STANDARD) FROM Account
|
||
|
|
```
|
||
|
|
|
||
|
|
### WHERE Clause Operators
|
||
|
|
|
||
|
|
| Operator | Example | Notes |
|
||
|
|
|----------|---------|-------|
|
||
|
|
| `=` | `Name = 'Acme'` | Exact match |
|
||
|
|
| `!=` | `Status != 'Closed'` | Not equal |
|
||
|
|
| `<`, `>`, `<=`, `>=` | `Amount > 1000` | Comparison |
|
||
|
|
| `LIKE` | `Name LIKE 'Acme%'` | Wildcard match |
|
||
|
|
| `IN` | `Status IN ('New', 'Open')` | Multiple values |
|
||
|
|
| `NOT IN` | `Type NOT IN ('Other')` | Exclude values |
|
||
|
|
| `INCLUDES` | `Interests__c INCLUDES ('Golf')` | Multi-select picklist |
|
||
|
|
| `EXCLUDES` | `Interests__c EXCLUDES ('Golf')` | Multi-select exclude |
|
||
|
|
|
||
|
|
### Date Literals
|
||
|
|
|
||
|
|
| Literal | Meaning |
|
||
|
|
|---------|---------|
|
||
|
|
| `TODAY` | Current day |
|
||
|
|
| `YESTERDAY` | Previous day |
|
||
|
|
| `THIS_WEEK` | Current week (Sun-Sat) |
|
||
|
|
| `LAST_WEEK` | Previous week |
|
||
|
|
| `THIS_MONTH` | Current month |
|
||
|
|
| `LAST_MONTH` | Previous month |
|
||
|
|
| `THIS_QUARTER` | Current quarter |
|
||
|
|
| `THIS_YEAR` | Current year |
|
||
|
|
| `LAST_N_DAYS:n` | Last n days |
|
||
|
|
| `NEXT_N_DAYS:n` | Next n days |
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Created in last 30 days
|
||
|
|
SELECT Id FROM Account WHERE CreatedDate = LAST_N_DAYS:30
|
||
|
|
|
||
|
|
-- Modified this month
|
||
|
|
SELECT Id FROM Contact WHERE LastModifiedDate = THIS_MONTH
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Relationship Queries
|
||
|
|
|
||
|
|
### Child-to-Parent (Dot Notation)
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Access parent fields
|
||
|
|
SELECT Id, Name, Account.Name, Account.Industry
|
||
|
|
FROM Contact
|
||
|
|
WHERE Account.AnnualRevenue > 1000000
|
||
|
|
|
||
|
|
-- Up to 5 levels
|
||
|
|
SELECT Id, Contact.Account.Owner.Manager.Name
|
||
|
|
FROM Case
|
||
|
|
```
|
||
|
|
|
||
|
|
### Parent-to-Child (Subquery)
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Get parent with related children
|
||
|
|
SELECT Id, Name,
|
||
|
|
(SELECT Id, FirstName, LastName FROM Contacts),
|
||
|
|
(SELECT Id, Name, Amount FROM Opportunities WHERE StageName = 'Closed Won')
|
||
|
|
FROM Account
|
||
|
|
WHERE Industry = 'Technology'
|
||
|
|
```
|
||
|
|
|
||
|
|
### Standard Relationship Names
|
||
|
|
|
||
|
|
| Object | Relationship Name | Example |
|
||
|
|
|--------|-------------------|---------|
|
||
|
|
| Account → Contacts | `Contacts` | `(SELECT Id FROM Contacts)` |
|
||
|
|
| Account → Opportunities | `Opportunities` | `(SELECT Id FROM Opportunities)` |
|
||
|
|
| Account → Cases | `Cases` | `(SELECT Id FROM Cases)` |
|
||
|
|
| Contact → Cases | `Cases` | `(SELECT Id FROM Cases)` |
|
||
|
|
| Opportunity → OpportunityLineItems | `OpportunityLineItems` | `(SELECT Id FROM OpportunityLineItems)` |
|
||
|
|
|
||
|
|
### Custom Object Relationships
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Custom relationship: add __r suffix
|
||
|
|
SELECT Id, Name, Custom_Object__r.Name
|
||
|
|
FROM Another_Object__c
|
||
|
|
|
||
|
|
-- Child relationship: add __r suffix
|
||
|
|
SELECT Id, (SELECT Id FROM Custom_Children__r)
|
||
|
|
FROM Parent_Object__c
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Aggregate Queries
|
||
|
|
|
||
|
|
### Basic Aggregates
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Count all records
|
||
|
|
SELECT COUNT() FROM Account
|
||
|
|
|
||
|
|
-- Count with alias
|
||
|
|
SELECT COUNT(Id) cnt FROM Account
|
||
|
|
|
||
|
|
-- Sum, Average, Min, Max
|
||
|
|
SELECT SUM(Amount), AVG(Amount), MIN(Amount), MAX(Amount)
|
||
|
|
FROM Opportunity
|
||
|
|
WHERE StageName = 'Closed Won'
|
||
|
|
```
|
||
|
|
|
||
|
|
### GROUP BY
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Count by field
|
||
|
|
SELECT Industry, COUNT(Id)
|
||
|
|
FROM Account
|
||
|
|
GROUP BY Industry
|
||
|
|
|
||
|
|
-- Multiple groupings
|
||
|
|
SELECT StageName, CALENDAR_YEAR(CloseDate), COUNT(Id)
|
||
|
|
FROM Opportunity
|
||
|
|
GROUP BY StageName, CALENDAR_YEAR(CloseDate)
|
||
|
|
```
|
||
|
|
|
||
|
|
### HAVING Clause
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Filter aggregated results
|
||
|
|
SELECT Industry, COUNT(Id) cnt
|
||
|
|
FROM Account
|
||
|
|
GROUP BY Industry
|
||
|
|
HAVING COUNT(Id) > 10
|
||
|
|
```
|
||
|
|
|
||
|
|
### GROUP BY ROLLUP
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Subtotals
|
||
|
|
SELECT LeadSource, Rating, COUNT(Id)
|
||
|
|
FROM Lead
|
||
|
|
GROUP BY ROLLUP(LeadSource, Rating)
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Advanced Features
|
||
|
|
|
||
|
|
### Polymorphic Relationships (What)
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Query polymorphic fields
|
||
|
|
SELECT Id, What.Name, What.Type
|
||
|
|
FROM Task
|
||
|
|
WHERE What.Type IN ('Account', 'Opportunity')
|
||
|
|
|
||
|
|
-- TYPEOF for conditional fields
|
||
|
|
SELECT
|
||
|
|
TYPEOF What
|
||
|
|
WHEN Account THEN Name, Phone
|
||
|
|
WHEN Opportunity THEN Name, Amount
|
||
|
|
END
|
||
|
|
FROM Task
|
||
|
|
```
|
||
|
|
|
||
|
|
### Semi-Joins and Anti-Joins
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Semi-join: Records that HAVE related records
|
||
|
|
SELECT Id, Name FROM Account
|
||
|
|
WHERE Id IN (SELECT AccountId FROM Contact)
|
||
|
|
|
||
|
|
-- Anti-join: Records that DON'T HAVE related records
|
||
|
|
SELECT Id, Name FROM Account
|
||
|
|
WHERE Id NOT IN (SELECT AccountId FROM Opportunity)
|
||
|
|
```
|
||
|
|
|
||
|
|
### Format and Currency
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Format currency/date in results
|
||
|
|
SELECT FORMAT(Amount), FORMAT(CloseDate) FROM Opportunity
|
||
|
|
|
||
|
|
-- Convert to user's currency
|
||
|
|
SELECT Id, convertCurrency(Amount) FROM Opportunity
|
||
|
|
```
|