• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

błąd w kwerendzie

Object Storage Arubacloud
0 głosów
355 wizyt
pytanie zadane 16 grudnia 2018 w SQL, bazy danych przez marcinconn Obywatel (1,560 p.)
edycja 16 grudnia 2018 przez marcinconn

mam tabele:

Sale(id, sal_nazwa), Klasa(id,kla_nazwa), Nauczyciel(id, nau_nazwa), Przedmiot(id, prz_nazwa), Dni(id, dni_nazwa), Termin(id, ter_nazwa) oraz Zajęcia(id, id_przedmiotu, id_sali, id_nauczyciela, id_klasy, id_dnia, id_terminu)

spróbowałem zrobić kwerendę wybierającą z tabeli Zajęcia, która za id podstawia wartości z reszty tabel, ale wyrzuca błąd składniowy w wyrażeniu kwerendy. Wie ktoś w jak rozwiązać problem? Dodatkowo powinno wybierać wszystkie id_dnia oraz id_terminu nawet jak nie mają nic dopisane

SELECT Przedmiot.prz_nzwa & ' - ' & Sala.sal_numer & ' - ' & Nauczyciel.nau_nazwa AS Lekcja, Dni.dni_nazwa, Termin.ter_nazwa
FROM Zajęcia INNER JOIN Przedmiot ON Zajęcia.id_przedmiotu=Przedmiot.Identyfikator AND INNER JOIN Sala ON Zajęcia.id_sali=Sala.Identyfikator AND INNER JOIN Nauczyciel ON Zajęcia.id_nauczyciela=Nauczyciel.Identyfikator AND INNER JOIN Dni ON Zajęcia.id_dnia=Dni.Identyfikator AND INNER JOIN Termin ON Zajęcia.id_terminu=Termin.Identyfikator;

używam MS Access

1 odpowiedź

+1 głos
odpowiedź 16 grudnia 2018 przez jeremus Maniak (59,720 p.)
wybrane 17 grudnia 2018 przez marcinconn
 
Najlepsza
--- takie zapytanie zwróci Ci wszystkie dni i terminy i  wstawi lekcję tam gdzie jest
SELECT d.*, z.prz_nazwa & ' - ' & z.sal_nazwa & ' - ' & z.nau_nazwa AS Lekcja 
FROM (select dni.id as id_dnia,dni.dni_nazwa,termin.id as id_ter,termin.ter_nazwa from dni,termin)  d  
left  join  ( select * from ((zajecia x inner join nauczyciel n on x.id_nauczyciela=n.id ) inner join przedmiot p on x.id_przedmiotu=p.id)  inner join sale s on x.id_sali=s.id) z 
on ( z.id_dnia=d.id_dnia  and z.id_terminu=d.id_ter) order by d.id_dnia,d.id_ter


-- a to tylko tam gdzie są lekcje - czyli poprawione Twoje zapytanie
-- uwaga skróciłem nieco nazwy poł aby za dużo nie pisac :)


SELECT Przedmiot.prz_nazwa & ' - ' & Sale.sal_nazwa & ' - ' & Nauczyciel.nau_nazwa AS Lekcja, Dni.dni_nazwa, Termin.ter_nazwa
FROM ((((Zajecia INNER JOIN Przedmiot ON Zajecia.id_przedmiotu=Przedmiot.Id)  INNER JOIN Sale ON Zajecia.id_sali=Sale.Id)  
INNER JOIN Nauczyciel ON Zajecia.id_nauczyciela=Nauczyciel.Id)  inner JOIN Dni ON Zajecia.id_dnia=Dni.Id ) inner JOIN Termin ON Zajecia.id_terminu=Termin.Id;

 

komentarz 16 grudnia 2018 przez marcinconn Obywatel (1,560 p.)
edycja 17 grudnia 2018 przez marcinconn

W sumie pierwsza kwerenda to prawie to, czego szukam. Prawie, ponieważ kwerenda ma służyć jako pośrednik pomiędzy tabelą zajęcia,a pivot table. Poniżej tak jak chciałbym żeby wyglądała

A tak chciałbym zrobić pivot table, ale problemem jest to, że wyświetla wiersze(Terminy) i kolumny(dni tygodnia) tylko tam, gdzie są lekcje, więc dlatego zależy mi, żeby każda klasa miała zawsze wszystkie wiersze i kolumny, choćby puste.

Przy uruchomieniu wyskakuje zapytanie o parametry:

dni.id, termin.id,  n.id, p.id, s.id, z.sal_nazwa

I mam takie pytanie, chcąc dodać tę kwerendę wrzucić do funkcji w c#, w której będzie dopisywane id_klasy, dla której chce się wybrać to wystarczy na końcu WHERE Zajęcia,id_klasy='<wartość>'; ?

 

 

komentarz 17 grudnia 2018 przez jeremus Maniak (59,720 p.)
pyta o parametry bo nazwy pól mam inne niz u Ciebie tj id zamiast identyfikator

do tego pierwszego zapytania chcesz jeszcze dołożyć  oprócz dni i terminów - klasę ? ( nawet wtedy gdy nie ma zajęć zaplanowanych  ?) - w takim razie dodaj klase do kartezjana ( pierwszy człon zapytania)
komentarz 17 grudnia 2018 przez marcinconn Obywatel (1,560 p.)
Dokładnie. Tabela zajęcia jest tak jakby lista wszystkich zajęć, widok ma dać połączenie trzech pół jako lekcje. Potem bazując po id klasy będę wybierał dla danej klasy wszystkie zajęcia i kwerendą krzyżową robił plan
1
komentarz 17 grudnia 2018 przez jeremus Maniak (59,720 p.)

-- no to coś takiego ( dopasuj nazwy pól  do swoich tabel)

SELECT d.*, z.prz_nazwa & ' - ' & z.sal_nazwa & ' - ' & z.nau_nazwa AS Lekcja 
FROM (select dni.id as id_dnia,dni.dni_nazwa,termin.id as id_ter,termin.ter_nazwa,klasa.id as id_klasa,klasa.kl_nazwa from dni,termin,klasa)  d  
left  join  ( select * from ((zajecia x inner join nauczyciel n on x.id_nauczyciela=n.id ) inner join przedmiot p on x.id_przedmiotu=p.id)  inner join sale s on x.id_sali=s.id) z 
on ( z.id_dnia=d.id_dnia  and z.id_terminu=d.id_ter and z.id_klasy=d.id_klasa) order by d.id_dnia,d.id_ter,d.id_klasa

 

komentarz 17 grudnia 2018 przez marcinconn Obywatel (1,560 p.)
Podsumowując, jak w tabeli Zajęcia nie będzie żadnych lekcji dla danej klasy to wyrzuci pustą siatkę z terminami i dniami tygodnia?
komentarz 17 grudnia 2018 przez jeremus Maniak (59,720 p.)
tak
komentarz 18 grudnia 2018 przez marcinconn Obywatel (1,560 p.)
edycja 18 grudnia 2018 przez marcinconn

Jak połączyć jeszcze kolumny id_dnia i dni_nazwa żeby była tylko nazwa Tak samo z terminem. Rezultat kwerendy krzyżowej w obecnym stanie jest taki:

Natomiast jak zrobiłem gotową tabelę z danymi wszystko wyglądało jak powinno.

Problem znika, jak zamiast nazw wierszy(7:00 - 8:30, itd.) oraz kolumn(Poniedziałek, itd.) użyję ich ID

komentarz 18 grudnia 2018 przez jeremus Maniak (59,720 p.)
za bardzo nie wiem o co chodzi - o kolejność dni i terminów ?

 aby były pon,wt, środa  itd bo teraz sa alfabetycznie

- tak samo terminy - sa alfabetycznie a mają być wg godzin - a godzin czyli id?

a nie można  w tej krzyżowej order by id  użyć  a pokazywać nazwy ?
komentarz 18 grudnia 2018 przez marcinconn Obywatel (1,560 p.)
Widziałeś w jakiejś szkole plan zajęć z ułożonymi dniami tygodnia w ten sposób?

Z terminami sobie poardzilem bo wybieram id_terminu jako lp i zawartość, którą mu odpowiada, sortując po id. Problem jest z dniami tygodnia, które domyślnie sortuje alfabetycznie, a chciałbym wg id(nazwa widoczna, nie id)
komentarz 18 grudnia 2018 przez jeremus Maniak (59,720 p.)
to może :

pivot str(id)+'.'+ nazwa

bedzie

1.Poniedziałek      2.Wtorek  itd

trochę oszukańczo ale .. z braku laku

bo chyba pivota nie można co innego pokazywać a po czym innym sortować ?

pewnie da się to zrobić - ale pachnie mi to czymś mocno skomplikowanym - pivot w pivocie chyba :)
komentarz 18 grudnia 2018 przez marcinconn Obywatel (1,560 p.)
Myślę, że sprawę rozwiązałoby wybieranie zamiast dwóch kolumn(id_dnia,Dni_nazwa)  jednej (id_dnia) robiąc jednocześnie inner join wstawiając nazwę dnia pod id.

Zrobiłem dla testów tabelę, w której wpisałem na stałe wartości i kreatorem odnośników stworzyłem relację, w wyniku której pod id miałem podstawioną nazwę dnia. Wtedy zadziałało jak powinno.
komentarz 19 grudnia 2018 przez marcinconn Obywatel (1,560 p.)

@jeremus, da się zrobić inne JOIN w select w from żeby osiągnąć połączenie wartości?

komentarz 19 grudnia 2018 przez jeremus Maniak (59,720 p.)

juz się pogubiłem :)

problemem jest pivot  - domyślnie sortuje alfabetycznie - nie wiem jak to zmienic 

tutaj jest cos o tym :

https://stackoverflow.com/questions/13755017/how-to-order-by-in-sql-pivot

 

ale tak porąbane ze nic nie rozumiem :)

 

 

 

Podobne pytania

0 głosów
1 odpowiedź 321 wizyt
pytanie zadane 20 stycznia 2020 w SQL, bazy danych przez Whistleroosh Maniak (56,980 p.)
0 głosów
0 odpowiedzi 812 wizyt
0 głosów
2 odpowiedzi 988 wizyt
pytanie zadane 5 października 2018 w SQL, bazy danych przez marekmarekmarek Nowicjusz (180 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...