Forum » Programiranje » SQL vprasanje
SQL vprasanje
VelikiJanez ::
V istem Querie bi rad naredil "polje" katero bi izracunalo koliko časa je cd/dvd pri prijatelju.
Help :D
http://imgur.com/a/PUzTa
Help :D
http://imgur.com/a/PUzTa
mm&r ::
A to maš MS SQL, poglej si DATEFIFF...
SELECT Ime, Prezime, DATEDIFF(day,GETDATE(),Ponudba.Datum_Ponudbe) ........
SELECT Ime, Prezime, DATEDIFF(day,GETDATE(),Ponudba.Datum_Ponudbe) ........
zavajon ::
Morda je kdo že izvedel select, ki mi nikakor ne gre
Imam tabelo s števili v rangih od do.
Zanima me SQL, ki bi vrnil vse manjkajoče range.
Primer:
Rad bi dobil manjkajoče range 5 - 5 in 8 - 10.
Mora pa biti select stavek, procedura ne pride v poštev.
Imam tabelo s števili v rangih od do.
Zanima me SQL, ki bi vrnil vse manjkajoče range.
Primer:
ID OD DO --------------- 1 1 3 2 4 4 3 6 7 4 11 15
Rad bi dobil manjkajoče range 5 - 5 in 8 - 10.
Mora pa biti select stavek, procedura ne pride v poštev.
FTad ::
zdaj, ali jaz ne razumem vprasanja, ali pa si ti podal premalo podatkov.
Ce v tabeli ni zapisanih manjkajocih rangov, jih s select stavkom ne bos iz nic ven potegnil.
Ce v tabeli ni zapisanih manjkajocih rangov, jih s select stavkom ne bos iz nic ven potegnil.
zavajon ::
Ja, ravno to bi rad. Zapisani so "zasedeni" rangi, jaz pa bi rad dobil "proste".
Če bi šlo le za manjkajoče vrednosti, je problem dokaj enostavno rešljiv, ampak jaz imam range.
Če bi šlo le za manjkajoče vrednosti, je problem dokaj enostavno rešljiv, ampak jaz imam range.
FTad ::
in tabela je napolnjena z vrednostmi tocno tako, kot si napisal zgoraj, ali je to rezultat ene poizvedbe?
zavajon ::
To je primer obstoječih podatkov, rezultat pa bi moral biti tak:
Seveda so v realnosti številke mnogo večje in tudi mnogo več zapisov je, tako da ne gre s kakšnim joinom na generirane vrednosti kot npr.:
OD DO -------- 5 5 8 10
Seveda so v realnosti številke mnogo večje in tudi mnogo več zapisov je, tako da ne gre s kakšnim joinom na generirane vrednosti kot npr.:
select rownum r from dual connect by rownum <= 100
Zgodovina sprememb…
- spremenilo: zavajon ()
smacker ::
SELECT (v prevodu izberi) izbere obstoječe podatke iz tabele. Neobstoječih ne zna pobrat. Če bi hotel to rešit z selectom, bi rabil še eno tabelo z vsemi možnimi rangi (vse kombinacije 1-2, 1-3, 1-4, ... 1-N, 2-3, 2-4, ... 2-N ....) drugače boš moral pa skripto napisat (ali stored procedura ali pa v programskem jeziku).
frudi ::
Kateri dialekt SQL te zanima? In ali so rangi neprekrivajoči?
V T-SQL imaš recimo na voljo LEAD in LAG funkcije, preko katerih lahko dostopaš do naslednje in prejšnje vrstice v setu, s temi lahko recimo najdeš tiste vrstice, kjer je stolpec OD naslednje vrstice za več kot 1 večji od stolpca DO trenutne vrstice (iz tega dobiš svoj iskani manjkajoči rang)
V T-SQL imaš recimo na voljo LEAD in LAG funkcije, preko katerih lahko dostopaš do naslednje in prejšnje vrstice v setu, s temi lahko recimo najdeš tiste vrstice, kjer je stolpec OD naslednje vrstice za več kot 1 večji od stolpca DO trenutne vrstice (iz tega dobiš svoj iskani manjkajoči rang)
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)
Zgodovina sprememb…
- spremenilo: frudi ()
zavajon ::
Če so rangi prekrivajoči, me v bistvu ne zanima, zanimajo me samo manjkajoči.
Rabim za Oracle.
Rabim za Oracle.
FTad ::
tako kot je smacker napisal. Neobstojecih podatkov ne mores selektirat, ce jih sploh ni. Razen, ce se motim in ima kdo od ostalih resitev.
WarpedGone ::
Ce v tabeli ni zapisanih manjkajocih rangov, jih s select stavkom ne bos iz nic ven potegnil.
Uporabiš sestavljen SELECT, kjer prvi del zgenerira vse možne vrednosti, drug pa iz njega izloči (MINUS, NOT EXIST, ...) tiste, ki obstajajo v tabeli.
Ostanejo tisti, ki ne obstajajo v tabeli.
Lahko počasno a dela.
Konkreten primer: prvi select generira vrednosti 1,2,3,4,... drugi odstrani tiste, ki obstajajo znotraj kakšnega intervala, ki je vpisan v tabeli, tretji pa preostale zapise združi, kjer je 'zvezno zaporedje', s kakšnim LEAD ali LAG.
Tole spodaj na pamet kot ideja za začetek:
{st.code}
SELECT *
FROM ( SELECT sub.V,1,-1 LAG(sub.V) OVER (ORDER BY 1) as PREV_V
FROM (SELECT ROWNUM AS v
FROM ALL OBJECTS
WHERE ROWNUM < 1000 /* max vrednost v rangu*/
) sub
WHERE NOT EXISTS (SELECT 1
FROM TABELA_RANGOV r
WHERE sub.V BETWEEN r.OD AND R.DO)
)
WHERE prev_v+1 != V /*izločiš zaporedne manjkoče range*/
{st.code}
Zbogom in hvala za vse ribe
zavajon ::
Sem poskusil nekako z joinom na naslednjo vrstico, kot je opisano v tisti rešitvi za manjkajoče vrednosti, za katero sem dal link, ampak mi nikakor ne uspe ...
Hvala Wrapped.
Sem poskusil z generiranimi vsem imožnimi vrednostmi, a žal melje v neskončno.
Polja z vrednostmi so deklarirana NUMBER(8), torej moram generirati ogromno količino števil.
sori, VARCHAR(8), a so notri numerične vrednosti, in to v resnici 8-mestne.
Hvala Wrapped.
Sem poskusil z generiranimi vsem imožnimi vrednostmi, a žal melje v neskončno.
Polja z vrednostmi so deklarirana NUMBER(8), torej moram generirati ogromno količino števil.
sori, VARCHAR(8), a so notri numerične vrednosti, in to v resnici 8-mestne.
Zgodovina sprememb…
- spremenilo: zavajon ()
WarpedGone ::
>> Sem poskusil z generiranimi vsem imožnimi vrednostmi, a žal melje v neskončno.
Pričakovano.
Bolša rešitev:
SELECT (sub.PREV_DO + 1) as OD,
(sub.OD - 1) as DO
FROM (SELECT r.OD, r.DO,
LAG(r.DO,1,NULL) OVER (ORDER BY R.OD) as PREV_DO
FROM TABELA_RANGOV r
) sub
WHERE NVL(sub.PREV_DO, sub.OD-1)+1 != sub.OD
Pričakovano.
Bolša rešitev:
SELECT (sub.PREV_DO + 1) as OD,
(sub.OD - 1) as DO
FROM (SELECT r.OD, r.DO,
LAG(r.DO,1,NULL) OVER (ORDER BY R.OD) as PREV_DO
FROM TABELA_RANGOV r
) sub
WHERE NVL(sub.PREV_DO, sub.OD-1)+1 != sub.OD
Zbogom in hvala za vse ribe
zavajon ::
Hvala Wraped
Sem vedel, da mora obstajati enostavna rešitev (le na tem forumu je treba vprašati ).
Sem vedel, da mora obstajati enostavna rešitev (le na tem forumu je treba vprašati ).
killa bee ::
zanim me zakaj dobim error "foreign key not properly formed" v MySQLu?
Najprej sem naredil to tabelo:
Zatem pa še to - tu mi javi error:
Najprej sem naredil to tabelo:
create table department (dept_name varchar (20), building varchar (15), budget numeric (12,2) check (budget > 0), primary key (dept_name));
Zatem pa še to - tu mi javi error:
create table course (course_id varchar (8), title varchar (50), dept_name varchar (20), credits numeric (2,0) check (credits > 0), primary key (course_id), foreign key (dept_name) references department on delete set null);
mm&r ::
Pri foreign key-u je ponavadi potrebno podati tudi polje na katerega se referenciraš ne samo ime tabele.
killa bee ::
aha, če dodam tole pa dela:
thanx
foreign key(dept_name) references department(dept_name)
thanx
FTad ::
a ni to enostavno
update <ime_tabele> set dept_name = 'Comp.Sci.' where dept_name = 'Comp.Sci';
FTad ::
ja zdaj, ce ni bil se notri kak white space v polju, potem bi moralo delat, sicer bi pa resil tezavo z
ali pa
edit: sele zdaj sem videl, da je bil vmes se en presledek med besedama...
update <ime_tabele> set dept_name = 'Comp.Sci.' where dept_name like '%Comp.Sci%';
ali pa
update <ime_tabele> set dept_name = 'Comp.Sci.' where lower(dept_name) like '%comp%';
edit: sele zdaj sem videl, da je bil vmes se en presledek med besedama...
Zgodovina sprememb…
- spremenil: FTad ()
killa bee ::
Tabela:
ne dovoli vnosa tega rowa??
create table takes ( ID varchar (5), course_id varchar (8), sec_id varchar (8), semester varchar (6), year numeric (4,0), grade varchar (2), primary key ( ID , course_id, sec_id, semester, year), foreign key (course_id, sec_id, semester, year) references section(course_id, sec_id, semester, year) on delete cascade, foreign key ( ID ) references student ( ID ) on delete cascade);
ne dovoli vnosa tega rowa??
ID,course_id,sec_id,semester,year,grade 98988,BIO-301,1,Summer,2010,null
Zgodovina sprememb…
- spremenilo: killa bee ()
killa bee ::
null je znotraj .csv file-a in je brez navednic.
Zgodovina sprememb…
- spremenilo: killa bee ()
killa bee ::
ID,course_id,sec_id,semester,year,grade 00128,CS-101,1,Fall,2009,A 00128,CS-347,1,Fall,2009,A- 12345,CS-101,1,Fall,2009,C 12345,CS-190,2,Spring,2009,A 12345,CS-315,1,Spring,2010,A 12345,CS-347,1,Fall,2009,A 19991,HIS-351,1,Spring,2010,B 23121,FIN-201,1,Spring,2010,C+ 44553,PHY-101,1,Fall,2009,B- 45678,CS-101,1,Fall,2009,F 45678,CS-101,1,Spring,2010,B+ 45678,CS-319,1,Spring,2010,B 54321,CS-101,1,Fall,2009,A- 54321,CS-190,2,Spring,2009,B+ 55739,MU-199,1,Spring,2010,A- 76543,CS-101,1,Fall,2009,A 76543,CS-319,2,Spring,2010,A 76653,EE-181,1,Spring,2009,C 98765,CS-101,1,Fall,2009,C- 98765,CS-315,1,Spring,2010,B 98988,BIO-101,1,Summer,2009,A 98988,BIO-301,1,Summer,2010,null
FTad ::
kaj pa napises za ukaz? Nisem ravno vesc vstavljanja podatkov iz fajla, ampak predvidevam, da tvoj ukaz smatra, da so vsi podatki v csv-ju tipa string.
FTad ::
ce bi napisal ukaz npr
bi moral brez dvoma pravilno vstavit v tabelo
insert into takes (ID,course_id,sec_id,semester,year,grade) values ('98988,'BIO-301','1','Summer',2010,null)
bi moral brez dvoma pravilno vstavit v tabelo
killa bee ::
insert into takes (ID,course_id,sec_id,semester,year,grade) values ('98988,'BIO-301','1','Summer',2010,null);
/* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'BIO-301','1','Summer',2010,null)' at line 1 */
/* Affected rows: 0 Found rows: 0 Warnings: 0 Duration for 0 of 1 query: 0.000 sec. */
/* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'BIO-301','1','Summer',2010,null)' at line 1 */
/* Affected rows: 0 Found rows: 0 Warnings: 0 Duration for 0 of 1 query: 0.000 sec. */
Zgodovina sprememb…
- spremenilo: killa bee ()
FTad ::
ce bi napisal ukaz npr
insert into takes (ID,course_id,sec_id,semester,year,grade) values ('98988,'BIO-301','1','Summer',2010,null)
bi moral brez dvoma pravilno vstavit v tabelo
insert into takes (ID,course_id,sec_id,semester,year,grade) values ('98988','BIO-301','1','Summer',2010,null)
pozabil sem opuscaj na koncu pri 98988...
killa bee ::
aha to pa dela, sepravi pri importu iz .csv-ja mora bit nek poseben način kako vstavit null
FTad ::
glede na to, da uporabljas mariaDb, pogooglaj, kako je z importom iz csv-ja. Probaj namesto, da napises null na koncu, da za vejico ne napises nic, mogoce bo prepoznalo to kot null.
ce ne pa lahko vseeno vstavis podatke v excel, konkateniras vse skupaj v insert stavke in enostavno zazenes ukaze, kot sem ti v primeru napisal.
ce ne pa lahko vseeno vstavis podatke v excel, konkateniras vse skupaj v insert stavke in enostavno zazenes ukaze, kot sem ti v primeru napisal.
MrStein ::
tako kot je smacker napisal. Neobstojecih podatkov ne mores selektirat, ce jih sploh ni. Razen, ce se motim in ima kdo od ostalih resitev.
Seveda lahko.
Primer je dal WarpedOne, tu pa je en preprost:
SELECT sysdate+1 AS jutri from Tvoja_TABELA;
Ta bo izpisal jutrišnji datum, čeprav ga ni v tabeli.
* - razen če ima tabela nič vrstic... ;)
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Zgodovina sprememb…
- spremenil: MrStein ()
FTad ::
tako kot je smacker napisal. Neobstojecih podatkov ne mores selektirat, ce jih sploh ni. Razen, ce se motim in ima kdo od ostalih resitev.
Seveda lahko.
Primer je dal WarpedOne, tu pa je en preprost:
SELECT sysdate+1 AS jutri from Tvoja_TABELA;
Ta bo izpisal jutrišnji datum, čeprav ga ni v tabeli.
* - razen če ima tabela nič vrstic... ;)
Ok, you got me here, ampak ta podatek op-ju ne bo pomagal :P
FTad ::
Pisem na pamet ampak poskusi takole:
delete from course where course_id in ( select c.course_id from course c left join section s on c.course_id = s.course_id where semester is null );
MrStein ::
Katera baza?
Mogoče tak:
semester je stolpec v tabeli section?
Kaj bi sploh naj stavek naredil?
Mogoče tak:
delete from course where not exists ( select 1 from section s where course.course_id = s.course_id and semester is not null );
semester je stolpec v tabeli section?
Kaj bi sploh naj stavek naredil?
---
JAVNA OBJAVA:
Sporočilo se briše (v celoti, da ni več vidno) s tem preprostim postopkom:
- klikneš "popravi"
- klikneš "polni popravi"
- izbrišeš vso besedilo (hekerji: ctrl-a , DEL, ostali: držiš tipko DEL ali backspace, dokler ni vse izbrisano, umetniki: z miško označiš vso besedilo in izbereš "Cut/Izreži")
- klikneš "pošlji"
(pišem spet, ker očitno folk še vedno ne pozna te preproste operacije)
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Zgodovina sprememb…
- spremenil: MrStein ()
killa bee ::
Baza je MYsql.
ta querry deluje samo sploh ga ne razumem ??
ta querry deluje samo sploh ga ne razumem ??
Zgodovina sprememb…
- spremenilo: killa bee ()
FTad ::
ja vgnezdena poizvedba preveri oz isce vse vrstice, kjer ne obstaja vnos, kjer semester ni null. Pac malo je vse skup negairano. "Select 1 from" je pa za zapis "true", ce je pogoj izpolnjen. Ce je true, potem izbrise vrstico v tabeli course.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | SQL syntax napakaOddelek: Programiranje | 1593 (1084) | MrStein |
» | oracle 12 identity (the old way)Oddelek: Programiranje | 1060 (865) | detroit |
» | PostgreSQL pomočOddelek: Programiranje | 2509 (2002) | Mato989 |
» | Potrebujem MySQL ukazOddelek: Programiranje | 2890 (2498) | zvmk |
» | baze podatkovOddelek: Programiranje | 1565 (1484) | urkrajnc |