Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
autor |
|
nexus4
Kreisi kasutaja

liitunud: 01.03.2012
|
09.07.2014 15:50:07
SQL ühte veergu tulemus |
|
|
Tere,
Selline küsimus, kas on võimalik ühte veergu tuua tulemus mitmest tabelist korraga?
Et kui tavaline päring toob näiteks ühest tabelist
11
22
33
44
null
null
null
Aga teises tabelis on ka nendele nullidele vasted olemas, siis võiks tulemus välja näha selline:
11
22
33
44
55
66
77
kus 11-44 on nt tabelist1 ja 55-77 tabelist2
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
 |
neros
HV Guru

liitunud: 26.11.2003
|
09.07.2014 15:54:18
|
|
|
union oleks siinkohal ilmselt v6tmes6na, ilma p2ringute sisu teadmata.
_________________ GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt. |
|
Kommentaarid: 48 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
40 |
|
tagasi üles |
|
 |
jnt
HV Guru

liitunud: 10.05.2005
|
|
Kommentaarid: 110 loe/lisa |
Kasutajad arvavad: |
   |
:: |
2 :: |
0 :: |
102 |
|
tagasi üles |
|
 |
nexus4
Kreisi kasutaja

liitunud: 01.03.2012
|
09.07.2014 16:36:02
|
|
|
neros kirjutas: |
union oleks siinkohal ilmselt v6tmes6na, ilma p2ringute sisu teadmata. |
union liidab lihtsalt kokku veerud, mul on vaja asendada ühest tabelist tulnud null read teisest tabelist sobivate* väärtustega
jnt kirjutas: |
joini tabelid kokku ja selecti omale vajalikud field'id IFNULL() funktsiooni kaudu. |
uurin, tegu oracle'ga seal vist sellist pole, aga nvl()'iga on võimalik midagi teha
*
tabel1 2 veergu
a -- 11
b -- 22
c -- 33
d -- 44
e -- null
f -- null
g -- null
tabel2 2veergu
a -- null
b -- 22
c -- null
d -- null
e -- 55
f -- 66
g -- null
vajalik tulemus
a -- 11
b -- 22
c -- 33
d -- 44
e -- 55
f -- 66
g -- null
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
 |
2ndalpha
HV kasutaja

liitunud: 03.11.2004
|
09.07.2014 16:47:03
|
|
|
SELECT NVL(t1.veerg, t2.veerg) FROM tabel1 t1
JOIN tabel2 t2 ON t2.mingiteineveerg = t1.mingiveerg
|
|
Kommentaarid: 23 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
22 |
|
tagasi üles |
|
 |
2korda2
HV kasutaja
liitunud: 19.07.2003
|
09.07.2014 17:12:02
|
|
|
Kui mõlemas tabelis on väärtus ja need on erinevad, kumb siis "õige" on? Oracle puhul ehk abiks ka CASE (kui asi ei piirdu vaid NULL-dega).
|
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
nexus4
Kreisi kasutaja

liitunud: 01.03.2012
|
09.07.2014 17:16:14
|
|
|
Kui mõlemas tabelis väärtused on ja kui nad ei ole identsed siis nt võiks saada määrata et tabel1 väärtus jääb
kangesti aju jookseb sinna exceli IF suunas, aga ei oska sql'i kirjutada midagi sama kavalat, et kui table1 veer2 on null siis võta table2 veerust2
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
 |
2ndalpha
HV kasutaja

liitunud: 03.11.2004
|
09.07.2014 17:19:27
|
|
|
Mu näites NVL(t1.veerg, t2.veerg) on pseudokoodina
if t1.veerg != null
return t1.veerg
else
return t2.veerg
Väärtuste identne olemine ei oma ju tähtsust. Vahet pole siis kumb võtta.
|
|
Kommentaarid: 23 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
22 |
|
tagasi üles |
|
 |
2korda2
HV kasutaja
liitunud: 19.07.2003
|
10.07.2014 13:03:21
|
|
|
2ndalpha kirjutas: |
Väärtuste identne olemine ei oma ju tähtsust. Vahet pole siis kumb võtta. |
Küsimus oligi selles, kui väärtused EI ole identsed.
nexus4 kirjutas: |
...kangesti aju jookseb sinna exceli IF suunas, aga ei oska sql'i kirjutada... |
Nagu viitasin - CASE.
|
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
2ndalpha
HV kasutaja

liitunud: 03.11.2004
|
10.07.2014 13:10:16
|
|
|
Kui nad ei ole identsed, siis tähendab et vähemalt üks neist ei ole null. Ja NVL-i abil see lähebki käiku.
Mis maagia Sa casega siis kirjutada tahaksid?
|
|
Kommentaarid: 23 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
22 |
|
tagasi üles |
|
 |
2korda2
HV kasutaja
liitunud: 19.07.2003
|
10.07.2014 13:18:05
|
|
|
2ndalpha,
minu jaoks ei ole päris selge, mida pärida üritatakse.
Kui tulemuses peavad olema üksnes kahe tabeli peale kokku kindla veeru unikaalsed väärtused, siis tuleks lisada distinct või group by. Kui tulemuses tahetakse näha kõiki olemasolevaid väärtusi mingi kindla lisatunnuse kaupa stiilis:
Rida1 väärtus=11 (tabelist 1)
Rida2 väärtus=22 (tabelist 1)
Rida3 väärtus=33 (tabelist 2)
...
siis sellisel juhul on oluline teada, mida teha kui:
Rida4 väärtus=44 (tabelis 1) või 45 (tabelis 2)
Ei ole väärtused identsed? Ei ole. Kas võib lihtsalt võtta esimese tabeli väärtuse? Ülesande püstitus sel kohal ei ütle midagi, mistõttu ongi vaja täpsustada.
|
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
2ndalpha
HV kasutaja

liitunud: 03.11.2004
|
10.07.2014 13:27:23
|
|
|
nexus4 kirjutas: |
Kui mõlemas tabelis väärtused on ja kui nad ei ole identsed siis nt võiks saada määrata et tabel1 väärtus jääb |
|
|
Kommentaarid: 23 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
22 |
|
tagasi üles |
|
 |
2korda2
HV kasutaja
liitunud: 19.07.2003
|
10.07.2014 13:33:03
|
|
|
Kui nii, siis nii. Sellisel juhul piisab ka nvl-st. CASE võimaldab peenemat loogikat (sisuliselt exceli IF analoog).
|
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
nexus4
Kreisi kasutaja

liitunud: 01.03.2012
|
10.07.2014 15:13:41
|
|
|
2ndalpha, pakutud variant peaks sobima, ainult et mul jääb päring lõputult jooksma...
nüüd läheb keeruliseks, sest mul on nii, et selles tabelis2 on ühe sisse kande näiteks a kohta mitu väärtust nt 11,22,33jne ja sissekandeid kokku on mitu miljonit ja ta tahab kõiki väärtuseid tuua, mis sellele ühele a'le vastab.
mul küll on tingimus sees mis peaks teoreetiliselt võtma ainult 1 a'le vastava väärtuse, aga ilmselt see ei tööta miskipärast :/
SELECT
A.veerg1
nvl(A.veerg2, b.veerg2),
TO_CHAR(MIN(b.algus), 'dd.mm.yyyy hh24:mm:ss'),
TO_CHAR(MAX(b.l6pp), 'dd.mm.yyyy hh24:mm:ss'),
FROM tabel1 A
left join tabel2 b ON A.veerg1=B.veerg1
GROUP BY A.ID, NVL(A.veerg2, B.veer2)
ORDER BY ID ASC
Selles tabel2 on siis 4veergu, esimene veerg sisaldab endas a,b,c jne, teine veerg 11,22,33, kolmas veerg aeg
ühe a sissekande kohta on mitu 11,22,33 ja algus aeg ja lõpu aeg
Kui mul on min ja max funktsioonid sees, siis kas ta teoorias peaks ikkagi suutma ainult ühe teise veeru väärtuse tagastama?
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
 |
2korda2
HV kasutaja
liitunud: 19.07.2003
|
10.07.2014 15:39:56
|
|
|
Grupeerimise tingimused peaksid vastama päringus kasutatavatele veergudele (A.veerg1 vs A.ID). Antud juhul peaks olema:
...
GROUP BY A.veerg1
Kasutada koos group by ja order by on jõudluse seisukohast raske juhus.
Oled ikka kindel, et tabelite join peaks olema üle veerg2 väärtuste?
|
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
nexus4
Kreisi kasutaja

liitunud: 01.03.2012
|
15.07.2014 16:12:52
|
|
|
2ndalpha, sinu pakutud nvl() tuli kenasti ülesandega toime, täname.
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
 |
|