» »

SQL vprasanje

SQL vprasanje

«
1
2

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

Unilseptij ::

Ena možnost je tole:

SELECT Ime, Prezime, Now()-Ponudba.Datum_Ponudbe
.....

VelikiJanez ::

hmmm negre mi tako z nekega razloga ali pa neznam implementirat

mm&r ::

A to maš MS SQL, poglej si DATEFIFF...


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

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.

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

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.

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
Zbogom in hvala za vse ribe

zavajon ::

Hvala Wraped:D
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:
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:
foreign key(dept_name) references department(dept_name)

thanx

killa bee ::

KAko bi spremenil Comp.Sci v Comp.Sci. (MySQL)?
 slika

slika

Zgodovina sprememb…

Dieu ::

I was blind but now I see!

FTad ::

a ni to enostavno

update <ime_tabele> set dept_name = 'Comp.Sci.' where dept_name = 'Comp.Sci';

killa bee ::

Ni delalo. Sm kliklnil na okno in ročno spremenil field

FTad ::

ja kaksen error ti je pa izpisalo?

killa bee ::

ni, samo 0 rows affected. Ampak ta problem sm rešil tako ali tako.

FTad ::

ja zdaj, ce ni bil se notri kak white space v polju, potem bi moralo delat, sicer bi pa resil tezavo z

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

FTad ::

daj zraven no se napisi, kak error ti izpise...

killa bee ::

Error je očiten.



Omejitev za grade je 2 "null" je pa dolg 4.

Zgodovina sprememb…

FTad ::

ja menda nisi dal null v navednice --> 'null'

killa bee ::

null je znotraj .csv file-a in je brez navednic.

Zgodovina sprememb…

FTad ::

predlagam, da pokazes vsebino csv fajla

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

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. */

Zgodovina sprememb…

FTad ::

FTad je izjavil:

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.

killa bee ::

----

Zgodovina sprememb…

  • spremenilo: killa bee ()

MrStein ::

FTad je izjavil:

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!

Zgodovina sprememb…

  • spremenil: MrStein ()

WarpedGone ::

Dodaš en COUNT(*) pa bo rezultat tut če je tabela prazna.
Zbogom in hvala za vse ribe

FTad ::

MrStein je izjavil:

FTad je izjavil:

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

killa bee ::

Kako nej popravim ta querry?

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

killa bee ::

---

Zgodovina sprememb…

  • spremenilo: killa bee ()

MrStein ::

Katera baza?

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?

killa bee je izjavil:

---


MrStein je izjavil:



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!

Zgodovina sprememb…

  • spremenil: MrStein ()

killa bee ::

Baza je MYsql.
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.
«
1
2


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

SQL syntax napaka

Oddelek: Programiranje
121589 (1080) MrStein
»

oracle 12 identity (the old way)

Oddelek: Programiranje
61057 (862) detroit
»

PostgreSQL pomoč

Oddelek: Programiranje
162505 (1998) Mato989
»

Potrebujem MySQL ukaz

Oddelek: Programiranje
122884 (2492) zvmk
»

baze podatkov

Oddelek: Programiranje
91564 (1483) urkrajnc

Več podobnih tem