Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> pytanie SQL
dawbog
post 6.05.2009, 18:31:57
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 6.05.2009

Ostrzeżenie: (0%)
-----


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);
Go to the top of the page
+Quote Post
ucho
post 6.05.2009, 18:47:02
Post #2





Grupa: Zarejestrowani
Postów: 300
Pomógł: 32
Dołączył: 31.07.2006

Ostrzeżenie: (0%)
-----


AFAIK ostatnie. A skąd się wzięły wątpliwości?
http://www.postgresql.org/docs/8.3/interac...ml#QUERIES-JOIN

Ten post edytował ucho 6.05.2009, 19:08:24
Go to the top of the page
+Quote Post
dawbog
post 6.05.2009, 19:40:53
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 6.05.2009

Ostrzeżenie: (0%)
-----


dziękuję za odpowiedź, na teście też zaznaczyłem tą odpowiedź, a wykładowca poinformował, że C jest dobra
Go to the top of the page
+Quote Post
ucho
post 6.05.2009, 20:33:10
Post #4





Grupa: Zarejestrowani
Postów: 300
Pomógł: 32
Dołączył: 31.07.2006

Ostrzeżenie: (0%)
-----


Kod
$ cat test.sql

  1. CREATE TABLE student( imie text , nazwisko text , id_wojew int);
  2. CREATE TABLE wojew(id_wojew int,nazwa_wojew text);
  3. INSERT INTO student (imie, nazwisko, id_wojew) VALUES ('Jan', 'Kowalski', 2);
  4. INSERT INTO wojew (id_wojew, nazwa_wojew) VALUES (1, 'Pomorskie');
  5. INSERT INTO wojew (id_wojew, nazwa_wojew) VALUES (2, 'Mazowieckie');
  6. SELECT imie, nazwisko, wojew.nazwa_wojew FROM student RIGHT JOIN wojew USING (id_wojew);
  7. SELECT imie, nazwisko, wojew.nazwa_wojew FROM student LEFT JOIN wojew USING (id_wojew);
  8. DROP TABLE student;
  9. 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" tongue.gif

Ten post edytował ucho 6.05.2009, 20:34:20
Go to the top of the page
+Quote Post
dawbog
post 6.05.2009, 21:19:03
Post #5





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 6.05.2009

Ostrzeżenie: (0%)
-----


POLITECHNIKA GDAŃSKA ; wydział: Fizyki Technicznej i Matematyki Stosowanej ; Podyplomowe studium Programowania i Baz Danych
Go to the top of the page
+Quote Post
maly_swd
post 6.05.2009, 22:12:53
Post #6





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

Ostrzeżenie: (0%)
-----


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)


--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
Go to the top of the page
+Quote Post
dawbog
post 6.05.2009, 22:33:05
Post #7





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 6.05.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
maly_swd
post 7.05.2009, 11:23:28
Post #8





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

Ostrzeżenie: (0%)
-----


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:)


--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
Go to the top of the page
+Quote Post
dawbog
post 7.05.2009, 13:40:27
Post #9





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 6.05.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
maly_swd
post 7.05.2009, 21:58:59
Post #10





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

Ostrzeżenie: (0%)
-----


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)


--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
Go to the top of the page
+Quote Post
dawbog
post 7.05.2009, 22:26:11
Post #11





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 6.05.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
maly_swd
post 8.05.2009, 09:13:17
Post #12





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

Ostrzeżenie: (0%)
-----


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


--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
Go to the top of the page
+Quote Post
luckboy
post 8.05.2009, 15:09:24
Post #13





Grupa: Zarejestrowani
Postów: 1
Pomógł: 1
Dołączył: 19.10.2008

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.05.2024 - 10:27