• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SQL - logika #2

VPS Starter Arubacloud
0 głosów
368 wizyt
pytanie zadane 9 marca 2023 w SQL, bazy danych przez Blds Użytkownik (830 p.)
edycja 9 marca 2023 przez Blds

Potrzebuje wyciagnac klientow i zamowienia z adresem innym niż PL. Mam trzy tabele: customer, order i order adress. Interesuja mnie zamowienia tylko z roku 2022 (datę mam tylko w tabel order) czy poniższe zapytanie mi to zwroci? To do czego mam wątpliwości to czy datę nie powinienem wrzucić do exists? Czy może wyjdzie na to samo? I czy ten warunek jednocześniej odfiltruje klientów którzy nie wysłąli nic w 2023 czy trzeba to jeszcze dodać?

SELECT c.customer_id, o.order_id
FROM customer as c
INNER JOIN order as o
WHERE o.date between '2022-01-01' and '2022-01-31'
AND EXISTS (SELECT 1 FROM order_address oa WHERE oa.order_id = o.order_id and oa.country!= 'PL')

 

1 odpowiedź

+3 głosów
odpowiedź 9 marca 2023 przez Wiciorny Ekspert (269,120 p.)

To jest niepoprawne ... po pierwsze nie ma warunku złączenia ON... na tabelach łączonych
Klauzula WHERE nie będzie dotyczyć złączenia.
Co ze złączeniem z tabelą order adres, aby mieć dostęp do danych ?
Dodatkowo kolejno, w zapytaniu nie ma instrukcji, która określałaby, że klienci, którzy nie dokonali zakupów w 2022 roku, nie powinni być uwzględniani.

Warunek nie odfiltruje wczesniej bo brakuje Ci podstaw składania zapytania SQL, kolejność nie jest taka jak piszesz 
https://akademia-vba.pl/2020/05/20/podstawy-sql-kolejnosc-klauzul-w-select
.
 

Kolejność wykonywania klauzul w SQL jest następująca:

  1. FROM - wskazuje z jakich tabel pobierane są dane
  2. JOIN - łączy dane z dwóch lub więcej tabel
  3. WHERE - określa warunki filtrowania wierszy
  4. GROUP BY - grupuje dane w określony sposób
  5. HAVING - określa warunki filtrowania dla grup
  6. SELECT - wybiera konkretne kolumny i/lub wyliczenia z tabeli lub tabel, a także określa kolejność sortowania
  7. DISTINCT - usuwa duplikaty z wyniku zapytania
  8. UNION/INTERSECT/EXCEPT - łączy wyniki zapytań z kilku tabel
  9. ORDER BY - określa kolejność sortowania wyników
  10. LIMIT/OFFSET - ogranicza ilość wyników zapytania.
     

Spradz to zapytanie: 

SELECT c.customer_id, o.order_id
FROM customer AS c
INNER JOIN orders AS o ON c.customer_id = o.customer_id
INNER JOIN order_address AS oa ON o.order_id = oa.order_id
WHERE o.date BETWEEN '2022-01-01' AND '2022-12-31'
AND oa.country <> 'PL'
AND c.customer_id IN (SELECT customer_id FROM orders WHERE date BETWEEN '2022-01-01' AND '2022-12-31');

Dodany jest warunek, aby warunek, który wymaga, aby adres zamówienia był inny niż 'PL' oraz
warunek IN, który ogranicza wyniki do klientów, którzy złożyli zamówienie w 2022 roku. 

komentarz 10 marca 2023 przez Blds Użytkownik (830 p.)
edycja 10 marca 2023 przez Blds
Dziękuję za odpowiedz. Teraz zauważyłem, że zabrakło on przy INNER JOIN oczywiście to powinno być. Natomiast nie do konca rozumiem różnicę miedzy moim zapytaniem, a Twoim. U mnie zamiast łączenia z tabelą order_address zrobiłem exists z tą tabelą.  Nie dałem też w nim warunku daty, ale warunek ten dałem w zewnętrznym selekcie. Czy nie ograniczy mi to wyników do tej daty? Co daje w takim razie u Ciebie wpisanie warunku daty w zewnętrznym selekcie skoro dałeś ten warunek w in?
komentarz 10 marca 2023 przez Wiciorny Ekspert (269,120 p.)
Jeśli nie dodano warunku daty w klauzuli EXISTS, to zapytanie może zwrócić wyniki z całego zakresu dat w tabeli order_address, niezależnie od daty w klauzuli WHERE. Wprowadzenie warunku daty w klauzuli WHERE po klauzuli EXISTS, nie wpłynie na wyniki zwrócone z klauzuli EXISTS, ale może ograniczyć wyniki połączenia z tabelami orders i customer do określonego zakresu dat.

Wpisanie warunku daty w klauzuli EXISTS może pomóc Ci w ograniczeniu wyników do określonej daty tylko dla tabeli order_address. Jednakże, jeśli próbujesz uzyskać wyniki tylko dla określonej daty dla całego zapytania, musisz dodać odpowiedni warunek daty dla każdej tabeli, która jest używana w zapytaniu.

Podobne pytania

0 głosów
1 odpowiedź 91 wizyt
pytanie zadane 30 czerwca 2023 w SQL, bazy danych przez Blds Użytkownik (830 p.)
0 głosów
1 odpowiedź 72 wizyt
pytanie zadane 23 lutego 2023 w SQL, bazy danych przez Blds Użytkownik (830 p.)
0 głosów
1 odpowiedź 116 wizyt
pytanie zadane 22 lutego 2023 w SQL, bazy danych przez Blds Użytkownik (830 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...