Wpis z mikrobloga

w jaki sposób nauczyć się pisać zapytania #sql? Mam takie zadanie - Find the countries that have lost all their ships in battles.
Ja napisałem taki kod -
SELECT a.country
FROM
(SELECT country, COUNT(Classes.class) AS COUNTClasses,
COUNT(Outcomes.ship) AS COUNT
Outcomes
FROM Classes
LEFT JOIN Ships
ON Classes.class = Ships.class
RIGHT JOIN Outcomes
ON Outcomes.ship = Ships.name
OR Outcomes.ship = Classes.class
WHERE result = 'sunk'
GROUP BY country) a
WHERE COUNTClasses = COUNTOutcomes
Poprawny jest taki:
WITH boat_count AS (SELECT country, COUNT(*) AS scount
FROM (SELECT s.name AS name,
c.country AS country
FROM classes c
JOIN ships s
ON c.class = s.class
UNION
SELECT o.ship AS name,
c.country AS country
FROM classes c
JOIN outcomes o
ON o.ship = c.class
) f
GROUP BY country)

SELECT b.country
FROM (SELECT country,
COUNT(*) AS sunkcount
FROM (SELECT s.name AS name,
c.country AS country
FROM classes c
JOIN ships s
ON c.class = s.class
UNION
SELECT o.ship AS name,
c.country AS country
FROM classes c
JOIN outcomes o
ON o.ship = c.class
) a
JOIN outcomes o
ON o.ship = a.name
WHERE result ='sunk'
GROUP BY country
) b
JOIN boat
count
ON boatcount.country = b.country
AND boat
count.scount = b.sunk_count
I tu zastanawiam się jakim cudem mam na to wpaść? To kwestia przerobienia iluś tam zapytań, czy po prostu jestem na to za głupi #zalesie #pytanie
  • 4
@kocio90: To baza danych:
The database of naval ships that took part in World War II is under consideration. The database consists of the following relations:
Classes(class, type, country, numGuns, bore, displacement)
Ships(name, class, launched)
Battles(name, date)
Outcomes(ship, battle, result)
Ships in classes all have the same general design. A class is normally assigned either the name of the first ship built according to the corresponding design, or a name that
@Tanczacy_z_widlami SQL nie jest trudny, dasz sobie radę.
Sprawdź łączenie tabel po pierwsze. Jeśli masz za dużo/za mało danych niż się spodziewasz zazwyczaj u początkującego tutaj jest problem.Rozrysuj sobie tą bazę, zobacz jakie są klucze główne i obce w tabelach - pomysł jak to połączyć w zapytaniu oraz postaw dobry warunek. Z racji że siedzę na telefonie trochę ciężko mi dokładnie sprawdzić.
@Tanczacy_z_widlami Tak duże zapytania pisze się etapami, a na końcu łączy w jedno duże query. Stopniowo wyciągasz kolejne dane z tabel, łączysz je, filtrujesz, agregujesz i tyle. Zawsze musisz ułożyć sobie w głowie uproszczony plan zapytania -w których tabelach znajdują się dane których potrzebujesz, i jak je łączyć.
Co do techniki -w modelowym rozwiązaniu użyto CTE (WITH boat_count...) -jest to bardziej przejrzyste rozwiązanie niż zwyczajne subquery; łatwiej to czytać i zrozumieć a