Ściąga SOQL i najczęstsze błędy
Wszystko o SOQL na jednej stronie: kolejność klauzul, operatory, daty, relacje, agregaty oraz komunikaty błędów z gotowymi rozwiązaniami.
Ta lekcja to ściąga do codziennej pracy. Zapisz ją w zakładkach i wracaj, gdy budujesz zapytanie do dokumentu albo eksportu.
Kolejność klauzul
Klauzule muszą wystąpić dokładnie w tej kolejności. Obowiązkowe są tylko SELECT i FROM.
SELECT pola, (podzapytanie), agregaty
FROM obiekt
WHERE warunki
GROUP BY pola
HAVING warunki_na_grupach
ORDER BY pola ASC|DESC NULLS FIRST|LAST
LIMIT liczba
OFFSET liczba
Wartości w warunkach
| Typ | Zapis | Przykład |
|---|---|---|
| Tekst | apostrofy | Name = 'Firma Testowa' |
| Liczba, kwota | bez apostrofów | Amount > 10000 |
| Checkbox | true / false | IsClosed = false |
| Puste pole | null | Email = null |
| Data | RRRR-MM-DD | CloseDate >= 2026-01-01 |
| Data i godzina | RRRR-MM-DDTgg:mm:ssZ | CreatedDate > 2026-01-01T00:00:00Z |
| Picklist | nazwa API wartości | StageName = 'Closed Won' |
| Id rekordu | apostrofy, 15 lub 18 znaków | AccountId = '001...' |
Operatory i literały
| Co | Składnia |
|---|---|
| Wzorzec tekstu | LIKE 'Acme%' (% dowolny ciąg, _ jeden znak) |
| Lista wartości | IN ('A', 'B'), NOT IN ('A', 'B') |
| Multi-select | INCLUDES ('A', 'B') (A lub B), INCLUDES ('A;B') (A i B) |
| Łączenie | AND, OR, NOT, nawiasy przy mieszaniu AND i OR |
| Literały dat | TODAY, THIS_MONTH, LAST_QUARTER, THIS_YEAR, LAST_N_DAYS:30 |
| Funkcje dat | CALENDAR_YEAR(), CALENDAR_MONTH(), DAY_ONLY() |
Relacje
| Cel | Składnia |
|---|---|
| Pole rodzica (standard) | Account.Name, Owner.Name, RecordType.DeveloperName |
| Pole rodzica (własne) | Seller__r.Email (pole Seller__c → relacja Seller__r) |
| Lista dzieci (standard) | (SELECT Name FROM Contacts) |
| Lista dzieci (własne) | (SELECT Name FROM Offers__r) |
| Rodzice z dziećmi spełniającymi warunek | WHERE Id IN (SELECT AccountId FROM Opportunity WHERE ...) |
| Rodzice bez dzieci | WHERE Id NOT IN (SELECT AccountId FROM Contact) |
Agregaty
| Cel | Składnia |
|---|---|
| Liczba rekordów | SELECT COUNT() FROM Contact |
| Zestawienie w grupach | SELECT StageName, COUNT(Id) liczba FROM Opportunity GROUP BY StageName |
| Suma, średnia, min, max | SUM(), AVG(), MIN(), MAX() |
| Filtr na grupach | HAVING COUNT(Id) > 1 |
Najczęstsze błędy
Salesforce zwraca komunikaty po angielsku. W tabeli są ich charakterystyczne fragmenty.
| Fragment komunikatu | Najczęstsza przyczyna | Rozwiązanie |
|---|---|---|
No such column | literówka w nazwie API, brak końcówki __c albo brak uprawnień do pola | sprawdź nazwę API w Object Manager i uprawnienia do pola |
Didn't understand relationship | nazwa obiektu zamiast nazwy relacji, brak __r | dla rodzica Seller__r.Name, dla dzieci nazwa relacji podrzędnej, np. Offers__r |
must be of type dateTime | data bez godziny w polu Date/Time | użyj formatu 2026-10-01T00:00:00Z albo literału, np. THIS_MONTH |
Field must be grouped or aggregated | pole w SELECT bez agregatu i bez GROUP BY | dodaj pole do GROUP BY albo usuń je z SELECT |
unexpected token | brak przecinka, cudzysłów zamiast apostrofu, AND i OR bez nawiasów | przeczytaj zapytanie od miejsca wskazanego w komunikacie |
invalid ID field | niepełne lub błędne Id w warunku | skopiuj Id rekordu jeszcze raz, w apostrofach |
Maximum SOQL offset allowed is 2000 | OFFSET większy niż 2000 | zawęź wyniki warunkiem WHERE zamiast przesuwać OFFSET |
Pułapka uprawnień: jeśli nie masz dostępu do pola, Salesforce traktuje je tak, jakby nie istniało, i zwraca
No such column. To samo zapytanie u administratora zadziała, a u zwykłego użytkownika nie. Ma to znaczenie także w narzędziach, które wykonują zapytania w imieniu użytkownika.
Dobre nawyki
- Wymieniaj pola jawnie. Pobieraj tylko to, czego naprawdę potrzebujesz. Zapytanie jest szybsze, a wynik czytelniejszy.
- Testuj z
LIMIT. NajpierwLIMIT 10, a pełny eksport dopiero wtedy, gdy wynik wygląda dobrze. - Sprawdzaj nazwy API, nie etykiety. Dotyczy pól, obiektów, relacji i wartości picklist.
- Filtruj po literałach dat zamiast wpisywać daty na sztywno. Zapytanie zapisane dziś zadziała też za miesiąc.
- Opisuj zapisane zapytania obok, nie w środku. SOQL nie obsługuje komentarzy, więc
--czy/* */w treści zapytania skończą się błędem. Opis trzymaj w nazwie zapisanego zapytania albo w notatce.
Wracasz po kursie? Szczegóły każdego tematu znajdziesz w lekcjach kursu: filtrowanie, relacje i agregacje.
Następny krok: w kursie Salesforce Flow przechodzisz do automatyzacji. Zaczniesz od lekcji Czym jest Salesforce Flow i kiedy warto go używać?