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

SQL - logika #2

Object Storage Arubacloud
0 głosów
414 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 (270,190 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 (270,190 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ź 77 wizyt
pytanie zadane 23 lutego 2023 w SQL, bazy danych przez Blds Użytkownik (830 p.)
0 głosów
1 odpowiedź 120 wizyt
pytanie zadane 22 lutego 2023 w SQL, bazy danych przez Blds Użytkownik (830 p.)

92,580 zapytań

141,432 odpowiedzi

319,665 komentarzy

61,965 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...