prosty select - inny możliwy zapis zapytania

0

Witam,
Właśnie zacząłem naukę SQL i po przerobieniu teorii zabrałem się za ćwiczenia ze stronki

http://www.sql-ex.ru

Generalnie problem polega na tym, że w jednym z pierwszych ćwiczeń wpisałem prosty SELECT, który zwraca poprawną tabelę, ale jednak wyskakuje mi błąd (że niby wyniki z drugiej tabeli są niepoprawne);

Treść ćwiczenia nr 6:

-> opis istniejących baz:
" The database scheme consists of four tables:
Product(maker, model, type)
PC(code, model, speed, ram, hd, cd, price)
Laptop(code, model, speed, ram, hd, screen, price)
Printer(code, model, color, type, price)"

-> Treść zadania: "For each maker producing laptops with a hard drive capacity of 10 Gb or higher, find the speed of such laptops. Result set: maker, speed. "

-> Moje zapytanie:

SELECT Product.maker, Laptop.speed FROM Product INNER JOIN Laptop ON Product.model = Laptop.model WHERE hd >= 10 ORDER BY speed ASC;

(końcówkę "ORDER BY speed ASC" dodałem na końcu, żeby uporządkował zwracaną tabelę jak tą właściwą, ale pomimo tego nadal wyrzuca mi błąd)

-> Zarówno wynik mojego zapytania, jak i poprawny są takie same:

maker speed
A 450
A 600
A 750
B 750

Jednak cały czas wywala mi błąd:

"Incorrect.
Your query returned the correct dataset on the first (available) database, but it returned incorrect dataset on the second checking database.

  • Wrong number of records (more by 2)"

Do ćwiczenia jest dołączony FAQ, według którego zadanie należałoby rozwiązać czymś w stylu:

SELECT DISTINCT Product.maker, Laptop.speed
FROM Product, Laptop 
WHERE Laptop.hd >= 10 AND 
 type IN(SELECT type 
 FROM Product 
 WHERE type = 'laptop'
 )

http://www.sql-tutorial.ru/book_exercise_6.html

Jak dla mnie nie da się rozwiązać tego zadania bez funkcji 'JOIN'.

Czy ktoś przechodził tą stronkę i wie o co może chodzić?
Czy może stronka jest zbugowana i nie przyjmuje poprawnej odpowiedzi??

0

"Incorrect.
Your query returned the correct dataset on the first (available) database, but it returned incorrect dataset on the second checking database.
Wrong number of records (more by 2)"

Zamień SELECT'a w twoim zapytaniu na SELECT DISTINCT. Informacja, którą otrzymałeś oznacza, że zbiór danych zwrócony przez Twoje zapytanie jest poprawny dla pierwszej bazy, natomiast zwraca niepoprawną ilość rekordów z drugiej bazy.

0

Fakt, głupi błąd, że aż wstyd ;)
Wielkie dzięki!

0

Coś czuję, że znowu będę się wstydził, bo rozwiązanie pewnie jest proste, ale znowu ugrzęzłem przy kolejnym ćwiczeniu z tej samej stronki.

Jest to zadanie nr 14 z tej samej stronki.
Całość jest na jednej tabeli 'Product' zawierającej trzy kolumny:

Product(maker, model, type)

--> treść zadania:

Get the makers who produce only one product type and more than one model. Output: maker, type.

Niby banalne, ale jak wpisuję najbardziej logiczne dla mnie zapytanie:

SELECT maker , type FROM Product GROUP BY maker, type HAVING COUNT(DISTINCT type) = 1 AND COUNT(DISTINCT model) > 1

to podaje mi za dużo wyników:

maker type
A Laptop
A PC
A Printer
D Printer
E PC

Nie jestem w stanie zrozumieć, dlaczego wyskakują mi 3 x maker "A", skoro już sam zapis HAVING COUNT(DISTINCT type) = 1 powinien ograniczać wyniki tylko do producentów, którzy wytworzyli tylko jeden typ produktu , a nie 3 (Laptop, PC, Printer).
Nie wiem też skąd bierze się producent E (producent E produkuje 3 rodzaje PC i jeden rodzaj Printera)

Poprawny wynik powinien wyglądać tak:

maker type
D Printer

Jak dotąd udało mi się tylko dojść do tego, że problem leży w niewłaściwym zapisaniu "type" w SELECT'cie.

Jeżeli odejmę "type" i zrobię:

SELECT maker FROM Product GROUP BY maker HAVING COUNT(DISTINCT type) = 1 AND COUNT(DISTINCT model) > 1

wyskakuje mi szukany producent (D), ale nie pokazuje typu jego produktu.

Próbowałem już wszystkiego, ale jakoś nie mogę trafić na rozwiązanie. Przykłady w tutorialach dotyczące HAVING i GROUP BY są dużo mniej złożone i niewiele pomagają.

0

HINT: Skoro grupujesz po [type], to ile ci wyjdzie Count(DISTINCT [type]) ?

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