Sql - różnica między dwoma bardzo podstawowymi zapytaniami

0

Witam. Zaznaczam, że jest to mój pierwszy dzień z SQL. Mam do napisania proste zapytanie:
Prosze wypisac dane wszystkich towarów, które sa z kategorii o nazwach rozpoczynajacych sie na litere C.
Napisałem 2 zapytania, które zwracają różne wyniki ( zakładam, że drugie zapytanie jest tym prawidłowym)

  1. SELECT distinct ProductName, CategoryName from Products, Categories where CategoryName LIKE 'c%
    
  2. SELECT distinct ProductName, CategoryName from Products p join Categories c ON p.CategoryID = c.CategoryID WHERE c.CategoryName LIKE 'C%'
    

CategoryID jest kluczem podstawowym tabeli Categories. Z czego wynikają różne wyniki tych 2 zapytań? Dlaczego tak się dzieję?

2

W 1. masz CROSS JOIN w 2. masz INNER JOIN.

0

Ok, rozumiem, że w takim wypadku rozwiązaniem prawidłowym jest to co sam zdecyduje, że chce wyciągnąć( w zależności od użycia joina)?

3

Zupełnym bezsensem jest tu cross join a potem dawanie distinct Może na tabelach rzędu 100 rekordów nie będziesz widział zbyt wielkiej różnicy wydajnościowej, ale co jak będziesz miał tabelę kategorii liczącą 200 rekordów, a w tabeli produktów 2 000 000 rekordów? To oznacza, że serwer będzie musiał stworzyć 400 000 000 rekordów w pamięci tylko po to aby wybrać z tego unikalne.

W takich sytuacjach łączysz sobie tabelę produktów z kategoriami, żeby mieć każdy rekord z produktów połączony z odpowiadającą mu kategorią. Dalej zawężasz do tych których kategoria rozpoczyna się na literę C. Robiąc cross joina po prosu uzyskujesz wszystkie możliwe pary produkt-kategoria a potem zawężasz te pary do tych których kategoria zaczyna się na literę C, więc zasadniczo uzyskujesz.... całą tabelę produktów, a raczej jej nazwy unikalne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1