Forum studentów informatyki UE Wrocław Strona Gwna


Poprzedni temat «» Nastpny temat
SQL-potrzebna rada:)
Autor Wiadomo
perelka 


Wiek: 35
Doczya: 02 Pa 2009
Posty: 290
Otrzyma 21 piw(a)
Skd: Wrocław
Wysany: 2011-05-15, 14:03   SQL-potrzebna rada:)

Mam taki problem i może ktoś umiałby mi pomóc. Hauke powiedział abym stworzyła tabele przemioty, korepetytor, przedmioty korepetytora, korepetycje, uczen). W przedmiotach jest atrybut przedmiot i zawiera ona takie wartości jak matma, polski itd., w korepetytorze najważniejsze jest id_korepetytora(sa rownież inne atrybuty jak imie, nazwisko itd). Mam problem z tabelą przedmioty korepetytora, gdyż w niej pod id_korepetytora ma być pare przedmiotów. I mam nastepujące 3 problemy:
1) Czy można w tabeli przedmioty_korepetytora wpisać pod jedno id_korepetytora parę przedmiotów? Bo można za każdym razie przy wpisywaniu podawać i_korepetytora i przedmiot, ale po to miała być ta osobna tabela, aby moć przypisywać parę przedmiotów pod jedno id i nie wiem jak to stworzyć...
2) jak w tej tabeli przedioty_korepetytora zablokować by pod przedmiot mogłybyć tylko wartości jak w tabeli przedmioty?
3) Jak w tabeli korepetycje zablokować tak, aby jak uczeń chce się zapisać do danego korepetytora to tylko na przedmiot, którego on udziela?
Postaw piwo autorowi tego posta
 
 
     
pit3r 
mistrzu


Wiek: 37
Doczy: 04 Sie 2009
Posty: 1463
Otrzyma 73 piw(a)
Skd: Mielec/Wrocław
Wysany: 2011-05-15, 14:43   

O.o
_________________
"Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej." A. Einstein

Go, pamiętaj jak piszesz
Postaw piwo autorowi tego posta
 
 
     
Wywietl szczegy
perelka 


Wiek: 35
Doczya: 02 Pa 2009
Posty: 290
Otrzyma 21 piw(a)
Skd: Wrocław
Wysany: 2011-05-15, 16:02   

Mało to pomocne starosto;p
Postaw piwo autorowi tego posta
 
 
     
oskarX 

Doczy: 10 Pa 2009
Posty: 184
Otrzyma 22 piw(a)
Wysany: 2011-05-15, 16:27   

myślę, że użycie "altera" Ci pomoże.

alter table [nazwa tablicy] add foreign key(id_...)references [nazwa tablicy] (id_...)
_________________
i przepuścili...
Postaw piwo autorowi tego posta
 
     
perelka 


Wiek: 35
Doczya: 02 Pa 2009
Posty: 290
Otrzyma 21 piw(a)
Skd: Wrocław
Wysany: 2011-05-15, 18:12   

Ake relację mam zrobioną tylko przez references, problem polega na tym(bo myśle że o tym mowisz), że jak do jednego id wpisać pare przedmiotów
Postaw piwo autorowi tego posta
 
 
     
pit3r 
mistrzu


Wiek: 37
Doczy: 04 Sie 2009
Posty: 1463
Otrzyma 73 piw(a)
Skd: Mielec/Wrocław
Wysany: 2011-05-16, 00:33   

Ad 1. - problem relacji typu "wiele do wielu" był poruszany na wykładzie z PSI. Można to rozwiązać stosując klasę pośrednią między korepetytorem, a prowadzonymi przez niego przedmiotami.

Mianowicie masz obiekty:
Korepetytor: ID_korepetytor(Klucz podstawowy), Nazwisko itd.
Przedmiot: ID_przedmiotu(Klucz podstawowy), Nazwa przedmiotu

Stwórz klasę obiektów - Korepetycje z atrybutami: ID_korepetycji(klucz podstawowy), ID_korepetytora, ID_przedmiotu

Klasa ta jest powiązana jednocześnie z korepetytorem oraz przedmiotami. Jeden korepetytor może nauczać wielu przedmiotów, jeden przedmiot może być nauczany przez wielu korepetytorów. Jednocześnie zachowujesz własność unikatowości konkretnych zajęć poprzez ID_korepetycji.

Ad 2
Nie wiem o co Ci dokładnie chodzi. Masz na myśli coś w rodzaju kontroli poprawności, żeby nie dało się wprowadzać niepoprawnych danych, żeby nie dało się wpisać nazwy przedmiotu np. "Dupa" ? Po co Ci coś takiego? Jak dla mnie bez sensu. Może korepetytor chce akurat tak nazwać swój przedmiot? Może naucza czegoś ambitniejszego niż J. angielski, Matematyka? Czegoś czego nie jesteśmy przewidzieć? Np. Systemy Komunkacji Gospodarczej? Powypisujesz tak wszystkie nazwy przedmiotów nauczanych na świecie? :-P

Ad 3 - tego kompletnie nie rozumiem

Myślę, że rozjaśniłem chociaż trochę odpowiedź na pierwsze pytanie :-D
_________________
"Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej." A. Einstein

Go, pamiętaj jak piszesz
Postaw piwo autorowi tego posta
 
 
     
e^x 

Doczy: 09 Sie 2009
Posty: 220
Otrzyma 14 piw(a)
Skd: Lublin
Wysany: 2011-05-16, 00:51   

AD 1.
Zgadzam się z Pit3r

AD 2.
Nie wiem czy dobrze zrozumiałem, ale jeśli chcesz aby zmienna na pozycji "przedmiot" przyjmowała tylko wartości z danego zbioru np. {POLSKI, MATEMATYKA, FIZYKA} to możesz użyć "check" :

ALTER TABLE PRZEDMIOTY
ADD (
PRZEDMIOT VARCHAR2(10) CHECK (PRZEDMIOT IN ('POLSKI','FIZYKA','MATEMATYKA'))
)

Jeśli o to ci chodzi

AD 3.
Rozumiem pytanie, ale jeszcze nad tym myślę
Postaw piwo autorowi tego posta
 
 
     
perelka 


Wiek: 35
Doczya: 02 Pa 2009
Posty: 290
Otrzyma 21 piw(a)
Skd: Wrocław
Wysany: 2011-05-16, 07:21   

Ad.2 ten sposob znam, ale ja chce by kontrolowało przedmioty i korepetytorów, którzy są wpisani do bazy. No nie wiem jeśli np. uczeń chce się zapisać do jakiegoś korepetytora to żeby kontrolowało, czy ten korepetytor uczy danego przedmiotu. Żeby nie wyszło, że ktoś bierze korepetytora i chce korki z angielskiego, a on uczy neimieckiego i matmy.

ad.1 Mam tabele pomocniczą typu przedmioty korepetytora:)

może wkleję to co dotąd napisałam(co nie twierdzę, że jest dobrze):

create table przedmioty(przedmiot varchar2(30)primary key);

create table korepetytor(id_korepetytor varchar2(5)primary key, imie_kor varchar2(10), nazwisko_kor varchar2(20), wojewodztwo_kor varchar2(20) check(wojewodztwo_kor in('dolnoslaskie', 'kujawsko-pomorskie', 'lubelskie', 'lubuskie', 'lodzkie', 'malopolskie', 'mazowieckie', 'opolskie', 'podkarpackie', 'podlaskie', 'pomorskie', 'slaskie', 'swietokrzyskie', 'warminsko-mazurskie', 'wielkopolskie', 'zachodniopomorskie')), miasto_kor varchar2(30), ulica_kor varchar(30), nr_ulicy_kor varchar(6),nr_domu_kor number(10), plec_kor varchar2(10)check(plec_kor in('kobieta', 'mezczyzna')),wiek_kor number(10),cena_za_h number(3,-2),nr_tel_kor number(30) not null,e-mail_kor varchar(50),nr_gg_kor number(30));

create table uczen(id_ucznia varchar2(5)primary kay, imie_ucznia varchar2(10), nazwisko_ucznia varchar2(20), wojewodztwo_ucznia varchar2(20) check(wojewodztwo_ucznia in('dolnoslaskie', 'kujawsko-pomorskie', 'lubelskie', 'lubuskie', 'lodzkie', 'malopolskie', 'mazowieckie', 'opolskie', 'podkarpackie', 'podlaskie', 'pomorskie', 'slaskie', 'swietokrzyskie', 'warminsko-mazurskie', 'wielkopolskie', 'zachodniopomorskie')), miasto_ucznia varchar2(30), ulica_ucznia varchar(30), nr_ulicy_ucznia varchar(6),nr_domu_ucznia number(10), plec_ucznia varchar2(10)check(plec_ucznia in('kobieta', 'mezczyzna')),wiek_ucznia number(10),nr_tel_ucznia number(30) not null,e-mail_ucznia varchar(50),nr_gg_ucznia number(30));

create table przedmioty_korepetytora(id_korepetytora varchar2(5) constraint id_k references korepetytor(id_korepetytora) primary key, przedmiot varchar2(30) constraint przed references przedmioty(przedmiot),przedmiot varchar2(30) references przedmioty;

create table korepetycje(id_korepetycji varchar2(5) primary key, id_korepetytora varchar2(5) constraint id_k references korepetytor(id_korepetytora), id_ucznia varchar2(5) constraint id_u references uczen(id_ucznia), , id_korepetytora varchar2(5) references korepetytor, przedmiot varchar2(30) references przedmioty,id_ucznia varchar2(5) references uczen,ilosc_h number(4), dzien date,godzina varchar(8)check(godzina in('7:00',8:00', '9:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00', '21:00'));
Postaw piwo autorowi tego posta
 
 
     
k.i.k.a. 


Doczya: 10 Sie 2009
Posty: 361
Otrzyma 15 piw(a)
Skd: Koszalin / Wrocław
Wysany: 2011-05-29, 08:24   

a ja mam pytanie:
o co chodzi elementami interakcyjnymi w poleceniach sql - parametyzacja poleceń sql? w sensie jakiego typu zapytania mają tu być?
i mógłby ktoś wrzucić przykładowe zapytania z rollup i cube bo zrobiłam jak jest w necie ale sqldeveloper wyrzuca błąd
Postaw piwo autorowi tego posta
 
 
     
k.i.k.a. 


Doczya: 10 Sie 2009
Posty: 361
Otrzyma 15 piw(a)
Skd: Koszalin / Wrocław
Wysany: 2011-05-29, 17:34   

ponawiam pytania - dotyczy projektu do Hauke :-P
Postaw piwo autorowi tego posta
 
 
     
e^x 

Doczy: 09 Sie 2009
Posty: 220
Otrzyma 14 piw(a)
Skd: Lublin
Wysany: 2011-05-29, 17:55   

http://www.cs.put.poznan....bs/plsem02b.pdf
Tutaj masz ładnie rozpisane o 'rollup' i 'cube' , ogólnie są to takie rozszerzenia 'group by' więc zamiast pisać 10 linijek gdzie na końcu będzie np. group by kraj group by region group by miasto group by dzielnica
możesz napisać "group by rollup(kraj,region,miasto,dzielnica)"
select ___ from ___ group by cube(a,b,c) zwróci ci grupowanie wg. (a,b,c) (a,b) (a,c) (b,c) (a) (b) (c) (), a jakbyś miała pisać to ręcznie za pomocą samego group by to musiałabyś napisać 8 ? poleceń
tu masz jeszcze trochę na ten temat :
http://zti.polsl.pl/szbdn...0SQL%20Info.pdf

a co do zapytań, to wrzuć swoje zapytania i odpowiedź programu , może po prostu jakąś literówkę popełniłaś, lub niedozwolony znak np. "-"
Postaw piwo autorowi tego posta
 
 
     
k.i.k.a. 


Doczya: 10 Sie 2009
Posty: 361
Otrzyma 15 piw(a)
Skd: Koszalin / Wrocław
Wysany: 2011-05-29, 19:18   

no ale jak wpisuje polecenie:
select * from student group by rollup(plec, nazwisko);
to wyskakuje mi komunikat
ORA-00979: to nie jest wyrażenie GROUP BY
00979. 00000 - "not a GROUP BY expression"
*Cause:
*Action:
Error at Line: 1 Column: 7
Postaw piwo autorowi tego posta
 
 
     
e^x 

Doczy: 09 Sie 2009
Posty: 220
Otrzyma 14 piw(a)
Skd: Lublin
Wysany: 2011-05-29, 19:49   

a jakie masz kolumny w tabeli "student" ? plec, nazwisko, i ... ?
Postaw piwo autorowi tego posta
 
 
     
k.i.k.a. 


Doczya: 10 Sie 2009
Posty: 361
Otrzyma 15 piw(a)
Skd: Koszalin / Wrocław
Wysany: 2011-05-29, 20:06   

id studenta
imie
nazwisko
plec
data urodzenia
Postaw piwo autorowi tego posta
 
 
     
e^x 

Doczy: 09 Sie 2009
Posty: 220
Otrzyma 14 piw(a)
Skd: Lublin
Wysany: 2011-05-29, 20:16   

Ale group by działa tak, że dzieli daną tabelę na rozłączne zbiory i WYKONUJE PEWNE DZIAŁANIA NA TYCH ZBIORACH np. sum(), avg(), min(), a załóżmy, że w tabeli student znajdują się kolumny:
imie
nazwisko
plec
wtedy nasze group dzieli nam całą tabelę najpierw wg. "plec" na 2 rozłączne zbiory, a potem wg. "nazwisko" na ileśtam także rozłącznych zbiorów, ale załóżmy, że dwóch studentów ma na nazwisko Nowak(i taką samą plec !!) (np. Tomasz i Jan) wtedy ten drugi podział (wg. nazwiska) wyznacza nam zbiór { {Jan Nowak M}, {Tomasz Nowak M} } i wtedy program powinien zwrócić nam coś takiego:

Imie | Nazwisko | Plec|
| | |
----------|-------------|-------|
Jan | Nowak | M |
Tomasz | | |
----------|-------------|-------|

ale w kolumnie "imie" musi znajdować się jedna wartość !! dlatego w "group by"stosuje się działania Min() , Max(), Sum() itd. bo wtedy te działania (Max, Min itd.) działają na tą komórkę (u nas jest to "imię") i zostaje tylko jedna wartość


przykład z tamtego PDF'a:

select region, produkt, sum(kwota)
from sprzedaz
group by rollup(region, produkt)

jeśli istniałyby dwie komórki np. {Mazowsze, oleje, 200} i {Mazowsze, oleje, 400} to po zastosowaniu "group by" jeśli zamiast sum(kwota) zostawilibyśmy "kwota" to w w jednej komórce mielibyśmy dwie wartości (trzeci elemet) {Mazowsze, oleje, 200 400} a w ten sposób mamy jedną

czyli w skrócie: przy stosowaniu "group by" po select mogą być tylko:
* kolumny wymienione po "group by"
lub
* kolumny z zastosowaną funkcją Min, Max, Avg, Sum, (konkatenacja też pewnie pójdzie)
Postaw piwo autorowi tego posta
 
 
     
Wywietl szczegy
Wywietl posty z ostatnich:   
Odpowiedz do tematu
Nie moesz pisa nowych tematw
Nie moesz odpowiada w tematach
Nie moesz zmienia swoich postw
Nie moesz usuwa swoich postw
Nie moesz gosowa w ankietach
Nie moesz zacza plikw na tym forum
Moesz ciga zaczniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Strona wygenerowana w 0,08 sekundy. Zapyta do SQL: 14