Ś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.

Lekcja 7 z 74 min czytania

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

TypZapisPrzykład
TekstapostrofyName = 'Firma Testowa'
Liczba, kwotabez apostrofówAmount > 10000
Checkboxtrue / falseIsClosed = false
Puste polenullEmail = null
DataRRRR-MM-DDCloseDate >= 2026-01-01
Data i godzinaRRRR-MM-DDTgg:mm:ssZCreatedDate > 2026-01-01T00:00:00Z
Picklistnazwa API wartościStageName = 'Closed Won'
Id rekorduapostrofy, 15 lub 18 znakówAccountId = '001...'

Operatory i literały

CoSkładnia
Wzorzec tekstuLIKE 'Acme%' (% dowolny ciąg, _ jeden znak)
Lista wartościIN ('A', 'B'), NOT IN ('A', 'B')
Multi-selectINCLUDES ('A', 'B') (A lub B), INCLUDES ('A;B') (A i B)
ŁączenieAND, OR, NOT, nawiasy przy mieszaniu AND i OR
Literały datTODAY, THIS_MONTH, LAST_QUARTER, THIS_YEAR, LAST_N_DAYS:30
Funkcje datCALENDAR_YEAR(), CALENDAR_MONTH(), DAY_ONLY()

Relacje

CelSkł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 warunekWHERE Id IN (SELECT AccountId FROM Opportunity WHERE ...)
Rodzice bez dzieciWHERE Id NOT IN (SELECT AccountId FROM Contact)

Agregaty

CelSkładnia
Liczba rekordówSELECT COUNT() FROM Contact
Zestawienie w grupachSELECT StageName, COUNT(Id) liczba FROM Opportunity GROUP BY StageName
Suma, średnia, min, maxSUM(), AVG(), MIN(), MAX()
Filtr na grupachHAVING COUNT(Id) > 1

Najczęstsze błędy

Salesforce zwraca komunikaty po angielsku. W tabeli są ich charakterystyczne fragmenty.

Fragment komunikatuNajczęstsza przyczynaRozwiązanie
No such columnliterówka w nazwie API, brak końcówki __c albo brak uprawnień do polasprawdź nazwę API w Object Manager i uprawnienia do pola
Didn't understand relationshipnazwa obiektu zamiast nazwy relacji, brak __rdla rodzica Seller__r.Name, dla dzieci nazwa relacji podrzędnej, np. Offers__r
must be of type dateTimedata bez godziny w polu Date/Timeużyj formatu 2026-10-01T00:00:00Z albo literału, np. THIS_MONTH
Field must be grouped or aggregatedpole w SELECT bez agregatu i bez GROUP BYdodaj pole do GROUP BY albo usuń je z SELECT
unexpected tokenbrak przecinka, cudzysłów zamiast apostrofu, AND i OR bez nawiasówprzeczytaj zapytanie od miejsca wskazanego w komunikacie
invalid ID fieldniepełne lub błędne Id w warunkuskopiuj Id rekordu jeszcze raz, w apostrofach
Maximum SOQL offset allowed is 2000OFFSET większy niż 2000zawęź 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

  1. Wymieniaj pola jawnie. Pobieraj tylko to, czego naprawdę potrzebujesz. Zapytanie jest szybsze, a wynik czytelniejszy.
  2. Testuj z LIMIT. Najpierw LIMIT 10, a pełny eksport dopiero wtedy, gdy wynik wygląda dobrze.
  3. Sprawdzaj nazwy API, nie etykiety. Dotyczy pól, obiektów, relacji i wartości picklist.
  4. Filtruj po literałach dat zamiast wpisywać daty na sztywno. Zapytanie zapisane dziś zadziała też za miesiąc.
  5. 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ć?