dawbog
6.05.2009, 18:31:57
witam, mógłby ktoś pomóc, i napisać dlaczego wybrał tą odpowiedź. Ponieważ zadanie niby proste a zdania są podzielone.
dzięki z góry.
Dane osobowe studenta znajdują się w tablicy student, przy czym w polu id_wojew znajduje się klucz obcy odwołujący się do klucza głównego o tej samej nazwie w tablicy wojew. Tablica wojew jest typowym słownikiem przy czym w polu nazwa_wojew znajduje się nazwa województwa. Które z poniższych zapytań SQL zwróci dane studenta z nazwą (nie numerem) województwa?
SELECT imie, nazwisko, wojew.nazwa_wojew FROM student, wojew WHERE student.id_wojew=id_wojew.wojew;
SELECT imie, nazwisko FROM student (SELECT wojew FROM wojew);
SELECT imie, nazwisko, wojew.nazwa_wojew FROM student RIGHT JOIN wojew USING(id_wojew);
SELECT imie, nazwisko, wojew.nazwa_wojew FROM student LEFT JOIN wojew USING (id_wojew);
dawbog
6.05.2009, 19:40:53
dziękuję za odpowiedź, na teście też zaznaczyłem tą odpowiedź, a wykładowca poinformował, że C jest dobra
Kod
$ cat test.sql
CREATE TABLE student( imie text , nazwisko text , id_wojew int);
CREATE TABLE wojew(id_wojew int,nazwa_wojew text);
INSERT INTO student (imie, nazwisko, id_wojew) VALUES ('Jan', 'Kowalski', 2);
INSERT INTO wojew (id_wojew, nazwa_wojew) VALUES (1, 'Pomorskie');
INSERT INTO wojew (id_wojew, nazwa_wojew) VALUES (2, 'Mazowieckie');
SELECT imie, nazwisko, wojew.nazwa_wojew FROM student RIGHT JOIN wojew USING (id_wojew);
SELECT imie, nazwisko, wojew.nazwa_wojew FROM student LEFT JOIN wojew USING (id_wojew);
DROP TABLE student;
DROP TABLE wojew;
Kod
$ psql test < test.sql
CREATE TABLE
CREATE TABLE
INSERT 0 1
INSERT 0 1
INSERT 0 1
imie | nazwisko | nazwa_wojew
------+----------+-------------
| | Pomorskie
Jan | Kowalski | Mazowieckie
(2 rows)
imie | nazwisko | nazwa_wojew
------+----------+-------------
Jan | Kowalski | Mazowieckie
(1 row)
DROP TABLE
DROP TABLE
To powiedz nam jeszcze na jakiej to uczelni pierwsze zapytanie lepiej pasuje do "zapytanie zwracające dane studenta"
dawbog
6.05.2009, 21:19:03
POLITECHNIKA GDAŃSKA ; wydział: Fizyki Technicznej i Matematyki Stosowanej ; Podyplomowe studium Programowania i Baz Danych
maly_swd
6.05.2009, 22:12:53
1. SELECT imie, nazwisko, wojew.nazwa_wojew FROM student, wojew WHERE student.id_wojew=id_wojew.wojew;
niestety na koncu ma blad, powinno byc student.id_wojew=wojew.id_wojew;
4. ma LEFT . A jak wiadomo LEFT laczy wyniki nawet jak nie ma w drugiej tabeli ID...
a jak wiadomo kazdy student MUSI byc przypisany do WOJEWODZTWA
3. Jest poprawne poniewaz na uczelni moze nie byc studenta z wojewodztwa X
2. to bledne zapytanie (skladnia)
dawbog
6.05.2009, 22:33:05
maly_swd czyli uwazasz ze 3 jest ok. tylko ze tak jak napisał ucho dostaniemy wtedy wszystkie województwa, a pytanie brzmi: Które z poniższych zapytań SQL zwróci dane studenta z nazwą (nie numerem) województwa?
Czyli priorytetem jest otrzymanie wszystkich studentów i przypisanych do nich województw.
maly_swd
7.05.2009, 11:23:28
Ale z logicznego (projekt bazy).
To nie mozemy miec studenta ktory nie jest przypisany do miasta/wojewodztwa. Wiec Left Join odpada.
Ale mozemy miec wojewodztwa a nie miec akurat w nich studentow.
Najbardziej pasujace byloby samo JOIN, ale nie ma:)
dawbog
7.05.2009, 13:40:27
No właśnie, zgadzam się z Tobą.
Skoro, wszyscy studenci mają przypisane województwa, oraz mamy województwa do których nie są przypisani studenci, to patrząc na przykład który podał ucho należy użyć LEFT JOIN.
Może mógłbyś podać jakiś konkretny kontrprzykład.
Dzięki za zainteresowanie.
maly_swd
7.05.2009, 21:58:59
Obydwa zapytanie sa poprawe pod wzgledem skladni i wyswietlenia wyniku z zalozenia... ALE... z logicznego powiazania juz tylko RIGHT JOIN... (przynajmniej na moja logike).
Kolega ucho podal wynik RIGHT join
imie | nazwisko | nazwa_wojew
------+----------+-------------
| | Pomorskie
Jan | Kowalski | Mazowieckie
(2 rows)
A left JOIN jak by mial wpisanego studenta bez wojewodztwa
imie | nazwisko | nazwa_wojew
------+----------+-------------
Jan | Kowalski | Mazowieckie
Jan | Nowak | NULL
Ogolnie powinno byc w tych odpowiedziach samo JOIN. Jak by przyklad 1. nie mial bledu to on by byl najbardziej poprawny
(2 rows)
dawbog
7.05.2009, 22:26:11
Masz racje, ale z drugiej strony mając wpisanego studenta "Jan Nowak", który nie ma podanego województwa i użyjemy RIGHT JOIN to nie otrzymamy go w wyniku zapytania.
Dzięki za pomoc, myślę, że już chyba czas zostawić tą sporną kwestię w spokoju.
A ja chyba muszę wyjaśnić tą sprawę, bo wygląda na to, że oba zapytania są poprawne na swój sposób.
maly_swd
8.05.2009, 09:13:17
masz racje:) z punktu widzenia SQL obydwa sa pioprawne. Z logicznego juz nie:) tak jak podales nie moze byc Jan Nowak bez wojewodztwa:D
pozdrawiam
luckboy
8.05.2009, 15:09:24
A województwo bez Jana Kowalskiego może być?
W treści pytania jest że trzeba podać dane studenta z nazwa województwa.
Co się stanie gdy będzie istniało województwo w którym nie mieszka żaden student?
W przypadku "SELECT imie, nazwisko, wojew.nazwa_wojew FROM student RIGHT JOIN wojew USING(id_wojew);" zostanie wyswietlone nazwa województwa bez danych studenta.
Jeśli chodzi o "SELECT imie, nazwisko, wojew.nazwa_wojew FROM student LEFT JOIN wojew USING (id_wojew);" jak sami powiedzieliście nie może być studenta który nie mieszka w żadnym województwie. A wiec jeśli dane w tabelach są poprawne to zapytanie z LEFT JOIN powinno dać poprawny wynik. W innym przypadku dane w tabelach są nie poprawne. Zaś nam chodzi o to by zapytanie dawało poprawny wynik gdy są poprawne dane.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.