konto usunięte

Temat: Proste ćwiczenie -prośba o wskazanie błędu

Witam!
Jest proste ćwiczenie ale za "Chiny ludowe" nie wiem dlaczego wychodzi mi błąd.
Otóż opisowo to są 3 tabele: klienci, towary, zamówienia i są wypełnione jakimiś danymi.
I teraz jest to ćwiczenie na podzapytanie zwracające wiele wartości.
Treść ćwiczenia: Zapisz zapytanie zwracające szczegóły zamówień o największej wartości dla każdego z towarów.
Problem polega na tym, że w wyniku dostaję 2 odpowiedzi dotyczące "nakrętek" a przecież z danego towaru może być tylko jedno zamówienie o max wartości (jeśli nie ma dokładnie takich samych zmówień o takiej samej max wartości na ten sam towar)!!!
Proszę o pomoc bo już oczy mi wychodzą na szypułkach a nie widzę blędu.
poniżej wklejam kod tabel, danych i ćwiczenia.



Create table klienci
(
id int primary key auto_increment,
imie varchar(20),
nazwisko varchar(20)
);
.......................................

insert into klienci
(imie, nazwisko)
values
('Jan', 'Kowalski'),
('Andrzej', 'Nowak'),
('Janusz', 'Malinowski'),
('Adam', 'Kowalski'),
('Krzysztof', 'Nowicki');

------------------------------------------------------------------

create table towary
(
id int primary key auto_increment,
nazwa varchar(30),
grupa numeric,
cena decimal(5,2)
);
..........................................

insert into towary
(nazwa, grupa, cena)
values
('Śruby', '1', '2.00'),
('Nakrętki', '1', '3.0'),
('Kątowniki', '2', '8'),
('Płaskowniki', '2', '9'),
('Gwoździe', '1', '1'),
('Panele', '3', '15'),
('Wkręty', '1', '4'),
('Deski', '3', '12'),
('Płyty', '3', '19');

-------------------------------------------------------------------

create table zamowienia
(
id int primary key auto_increment,
klient_id int,
towar_id int,
data date,
wartosc numeric(5,2),
constraint klient_fk foreign key (klient_id) references klienci(id),
constraint towary_fk foreign key (towar_id) references towary(id)
);
.............................................

insert into zamowienia
(klient_id, towar_id, data,wartosc)
values
('1', '2', '2007.01.01', '12.44'),
('1', '4', '2007.01.01', '10.22'),
('1', '2', '2007.02.12', '15.88'),
('2', '1', '2007.01.01', '22.35'),
('2', '1', '2007.02.02', '28.00'),
('2', '4', '2007.03.01', '2.28'),
('3', '1', '2007.02.11', '18.48'),
('3', '4', '2007.01.01', '12.44'),
('4', '1', '2007.03.11', '15.26'),
('5', '4', '2007.03.02', '6.11');


Ćwiczenie 1

Napisz zapytanie zwracające szczegóły zamówień o nawyższej wartości dla każdego z zamowień.

select zamowienia.id, imie, nazwisko, nazwa, data, wartosc
from zamowienia, towary, klienci
where wartosc in
(select max(wartosc) from zamowienia group by towar_id)
and zamowienia.klient_id=klienci.id
and zamowienia.towar_id=towary.id
order by wartosc;


Pozdrawiam: PiotrPiotr Lutyński edytował(a) ten post dnia 03.12.10 o godzinie 20:04
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Proste ćwiczenie -prośba o wskazanie błędu

Może tak?

select zamowienia.id, imie, nazwisko, nazwa, data, wartosc
from zamowienia, towary, klienci
where (towar_id,wartosc) in
(select towar_id,max(wartosc) from zamowienia group by towar_id)
and zamowienia.klient_id=klienci.id
and zamowienia.towar_id=towary.id
order by wartosc;

Musisz wybierać maksymalną wartość dla każdego towaru (czyli dorzucasz sprawdzenie id_towaru), jeżeli dobrze zrozumiałem problem.

konto usunięte

Temat: Proste ćwiczenie -prośba o wskazanie błędu

Witam!
Rzeczywiście teraz dostałem to co powinno wyjść. Widać, że zabrakło towar_id a ja tak dalece zasugerowałem się przykładem...
Ten przykład był przepisany z podręcznika SQL Ćwiczenia i chyba musiał być w niej błąd...szkoda, ze ma w niej erraty :(
Zresztą tych błędów chyba jest więcej bo oni w rysunku inne podają nieco inne wartości a nie mogą być inne bo przecież w rubrykach wartość są takie wartości jakie są...
Ale podręczniki też piszą ludzie omylni :)
Serdecznie dziękuję za podpowiedź :)

PozdrawiamPiotr Lutyński edytował(a) ten post dnia 03.12.10 o godzinie 21:44

konto usunięte

Temat: Proste ćwiczenie -prośba o wskazanie błędu

Pytanie dodatkowe dotyczące podzapytań skorelowanych (do tego samego zestawu tabel):
Poniżej podane zapytanie działa w MySQL ale nie chce działać na ORACLE. Czy można prosić o wskazanie gdzie tkwi błąd dla ORACLE i jak powinno wyglądać to zapytanie w ORACLE?


SELECT id, nazwa, cena, grupa
FROM towary
WHERE cena >
(SELECT avg(cena)
FROM towary as towary2
WHERE towary.grupa=towary2.grupa
)
ORDER BY cena;


PozdrawiamPiotr Lutyński edytował(a) ten post dnia 04.12.10 o godzinie 14:31
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Proste ćwiczenie -prośba o wskazanie błędu

Zamiast

FROM towary AS towary2

powinno być

FROM towary towary2


Przy stosowaniu aliasów tabel w Oracle nie używa się słówka AS

konto usunięte

Temat: Proste ćwiczenie -prośba o wskazanie błędu

Działa :)
Dzięki :)

Pozdrawiam
Tomasz Radomski

Tomasz Radomski Programista baz
danych,
Statconsulting

Temat: Proste ćwiczenie -prośba o wskazanie błędu

Grzegorz Drzymała:
Zamiast

FROM towary AS towary2

powinno być

FROM towary towary2


Przy stosowaniu aliasów tabel w Oracle nie używa się słówka AS


A to dlaczego się nie używa ? Standard ANSI SQL dopuszcza stosowanie składni
FROM towary AS towary2
aczkolwiek nie jest ono wymagane.
Tomasz Radomski

Tomasz Radomski Programista baz
danych,
Statconsulting

Temat: Proste ćwiczenie -prośba o wskazanie błędu

Grzegorz Drzymała:
Zamiast

FROM towary AS towary2

powinno być

FROM towary towary2


Przy stosowaniu aliasów tabel w Oracle nie używa się słówka AS


A to dlaczego się nie używa ? Standard ANSI SQL dopuszcza stosowanie składni
FROM towary AS towary2
aczkolwiek nie jest ono wymagane.
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Proste ćwiczenie -prośba o wskazanie błędu

Tomasz Radomski:
Grzegorz Drzymała:
Zamiast

FROM towary AS towary2

powinno być

FROM towary towary2


Przy stosowaniu aliasów tabel w Oracle nie używa się słówka AS


A to dlaczego się nie używa ? Standard ANSI SQL dopuszcza stosowanie składni
FROM towary AS towary2
aczkolwiek nie jest ono wymagane.

Przecież to, że standard dopuszcza taką składnię nie oznacza, że w oraclu będzie wszystko identycznie.

Prawidłowa składnia polecenia SELECT rozpisana jest tutaj:
http://download.oracle.com/docs/cd/B28359_01/server.11...

Opcjonalne AS jest oczywiście możliwe, ale jedynie przy stosowaniu aliasów kolumn.



Wyślij zaproszenie do