Witam, stworzyłem sobie taką baze danyh (ma to być taka mini wypożyczalnia meczów piłkarskich). Mam problem, gdy chce wyświetlić nazwy obydwu drużyn, date ich meczu oraz wynik. Próbuje zapytaniem poniżej jednak wyrzuca jakiś błąd. W czym może być problem?
SELECT DRU_DRUZYNY, DRU_DRUZYNY, MEC_DATA_MECZU, MEC_WYNIK
FROM MECZ, DRUZYNY WHERE MEC_ID_DRUZYNY1=DRU_ID_DRUZYNY AND MEC_ID_DRUZYNY=DRU_ID_DRUZYNY;
"SELECT DRU_DRUZYNY, DRU_DRUZYNY ..."
Wybierasz w selekcie dwa identyczne pola?
Nie wczytujac sie z strukture bazy bo lece juz do roboty - jesli z jednej tabeli to nie ma sensu, jesli z dwoch to bedzie cos w stylu
SELECT TABELA_1.DRU_DRUZYNY AS DRU1, TABELA_2.DRU_DRUZYNY AS DRU2,
/edit. A widze ze to jedna tabela, tylko to zapytanie jest troche bez sensu, ma co najmniej dwie niejednoznacznosci ktorych baza nie przeskoczy
SELECT DRU_DRUZYNY, MEC_DATA_MECZU, MEC_WYNIK
FROM MECZ, DRUZYNY WHERE MEC_ID_DRUZYNY1=DRU_ID_DRUZYNY OR MEC_ID_DRUZYNY=DRU_ID_DRUZYNY;
AND zamieniony na OR i zapytanie wyciagnie ci obie nazwy druzyn z tabeli druzyny jako result z dwoma rekordami (w swoim pytaniu pytales tak naprawde o rekord w ktorym id druzyny jest jednoczesnie taki i taki - juz pomijajac niejednoznacznosc z wyciaganych polach)
Ale to tak naprawde po jednym rzucie oka bo sie spiesze
/edit. A widze ze to jedna tabela,
To dwie tabele (FROM MECZ, DRUZYNY).
Takie rzeczy logiczniej załatwia się joinem - być może da się przez dodanie kolejnej tabeli do FROM ale jakoś nie jestem zwolennikiem takich rozwiązań.
Niżej polecenie, które wybiera dwie nazwy drużyn.
SELECT `LEWA`.`DRU_DRUZYNY` AS `LEWA_DRUZYNA`, `PRAWA`.`DRU_DRUZYNY` AS `PRAWA_DRUZYNA`
FROM `MECZ`
LEFT JOIN `DRUZYNY` AS `LEWA`
ON `MECZ`.`MEC_ID_DRUZYNY1` = `LEWA`.`DRU_ID_DRUZYNY`
LEFT JOIN `DRUZYNY` AS `PRAWA`
ON `MECZ`.`MEC_ID_DRUZYNY` = `PRAWA`.`DRU_ID_DRUZYNY`
Ja tu widze chec wybrania z jednej tabeli "druzyny" dwoch druzyn zapisanych w rekordzie tabeli "mecz". Stad kionstrukcja zwyklego selecta z jednym prostym warunkiem.
Kazde rozwiazanie ktore dziala zgodnie z oczekiwaniami jest z zasady prawidlowe :)
Ja nie lubie jednak niepotrzebnie operowac joinami jesli nie jest to absolutnie konieczne. W kazdym razie nie wazne jak, byle dzialalo ;)
Witam, dziękuje wam za pomoc, ale coś mi to nie działa. Poltar - próbowałem też dawać OR, ale wtedy wyciąga mi tylko jedną drużyne z bazy.
Niestety dopiero raczkuje i ucze się podstaw baz danych więc polecenie join jeszcze mi jest obce, ale próbowałem właśnie tym poleceniem co napisał Tuminure wybrać dwie nazwy drużyn, jednak po skompilowaniu troszke sie zdziwiłem, bo kompilator tak jakby tego polecenia w ogóle nie widział, zostało ono całkowicie pominięte.
W czym może być problem?
Tuminure:
'FROM MECZ, DRUZYNY WHERE MEC_ID_DRUZYNY1=DRU_ID_DRUZYNY [...]' to też join :P
@poltar
Nie przyjrzałem się Twojemu zapytaniu wcześniej, po przeczytaniu wcześniej zacytowanego fragmentu.
Czy Twoje zapytanie jest poprawne?
1. Jeżeli będziemy chcieli sprawdzić mecz rozegrany przez drużynę X i drużynę Y - Twoje zapytanie się posypie (wyświetli wszystkie mecze rozegrane przez drużynę X i Y).
2. Jeżeli będziemy chcieli sprawdzić wszystkie mecze rozegrane przez drużynę X - Twoje zapytanie się posypie. (wyświetli tylko nazwę drużyny, której wyników szukamy, nie wyświetli nazwy drużyny przeciwnika).
3. Nie rozróżnisz MEC_ID_DRUZYNY od MEC_ID_DRUZYNY1, czyli nie sprawdzisz kto był zwycięzcą, a kto przegranym - dostaniesz tylko wynik i dwie nazwy drużyn, biorące udział w meczu... czasem w dobrej kolejności, a czasem w złej.
4. Wyciągasz z bazy powielone dane (wszystkie dane z kolumny MECZ będą wybierane dwukrotnie), co przy dużej ilości danych może stanowić problem.
Zatem - moim zdaniem Twoje zapytanie jest poprawne, o ile nie mamy zamiaru nim robić niczego, co wymieniłem powyżej.
@Loczek
Wiem... ale czy
'FROM MECZ, DRUZYNY WHERE MEC_ID_DRUZYNY1=DRU_ID_DRUZYNY OR MEC_ID_DRUZYNY=DRU_ID_DRUZYNY'
to nadal join? Jeżeli tak, to... jaki?
@down
Racja - z przyzwyczajenia wszystkie nazwy kolumn i tabel piszę małymi literami... przy okazji zaktualizowałem swoje zapytanie
SELECT
MECZ.MEC_ID_MECZU,
MECZ.MEC_DATA_MECZU,
druzyna1.DRU_DRUZYNY,
druzyna2.DRU_DRUZYNY
LEFT JOIN DRUZYNY AS druzyna1
ON MECZ.MEC_ID_DRUZYNY1 = druzyna1.DRU_ID_DRUZYNY
LEFT JOIN DRUZYNY AS druzyna2
ON MECZ.MEC_ID_DRUZYNY = druzyna2.DRU_ID_DRUZYNY
bo nazwy tabel są case sensitive?
Tuminure: tak - Inner join (część wspólna z 2 tabel). Ilość warunków nie wpływa na typ joina :)
Mógłbyś napisać zapytanie w ten sposób:
INNER JOIN table_name2
ON (table_name1.column_name=table_name2.column_name AND/OR ... więcej warunków)
Dzięki wielkie za pomoc, nie ogarniam jeszcze tego joina do końca - kompilator (Oracle sql plus) chyba też nie, bo po dodaniu tego zapytania wyświetla się liczba linijek kodu owego joina i tyle...