Forum » Programiranje » [Oracle] Osnovno povpraševanje problem
[Oracle] Osnovno povpraševanje problem
nuclear ::
Zdravo.
Zanima me kako iz VIEWa selectaš kolumno, če imaš v VIEWu več tabel povezanih in moraš uporabiti za select v VIEWU ime_tabele.kolumna..?
Primer ki mi ne deluje:
Napaka:
Niam nobene ideje kako bi lahko selectal.. Uporabil sem vse živo, aliase, brez imena tabel...
Zanima me kako iz VIEWa selectaš kolumno, če imaš v VIEWu več tabel povezanih in moraš uporabiti za select v VIEWU ime_tabele.kolumna..?
Primer ki mi ne deluje:
CREATE VIEW drugi AS SELECT Stranka.Ime, Stranka.Priimek, Clan.Vclanjen as v FROM Stranka INNER JOIN Clan ON Stranka.idStranka = Clan.idStranka INNER JOIN Letalisce ON Letalisce.idLetalisce = Clan.idLetalisce WHERE Letalisce.NazivLetalisca = 'Letalisce 19'; SELECT * FROM drugi WHERE drugi.v = (SELECT MAX(drugi.v) from drugi); DROP VIEW drugi
Napaka:
1 SELECT * FROM drugi
2 WHERE drugi.v = (SELECT MAX(drugi.v) from drugi);
WHERE drugi.v = (SELECT MAX(drugi.v) from drugi)
*
ERROR at line 2:
ORA-00904: "DRUGI"."V": invalid identifier
Niam nobene ideje kako bi lahko selectal.. Uporabil sem vse živo, aliase, brez imena tabel...
Asus G14 2023 - Ryzen 7940HS - 32GB DDR5 - GeForce RTX 4080 - 990 PRO 4TB
btree ::
mogoče ga moti alias "v" v view-ju, probaj ga spremeniti v "vclan" in selectiraj brez predpon, saj bereš le iz enega view-ja:
SELECT *
FROM drugi
WHERE vclan =
(SELECT MAX(vclan)
FROM drugi);
kaj pa vrne: SELECT MAX(vclan) FROM drugi; ?
SELECT *
FROM drugi
WHERE vclan =
(SELECT MAX(vclan)
FROM drugi);
kaj pa vrne: SELECT MAX(vclan) FROM drugi; ?
nuclear ::
Ne dela niti ena stvar... Drugače pa za "SELECT MAX(vclan) FROM drugi;" vrne:
SQL> CREATE VIEW drugi AS
2 SELECT Stranka.Ime, Stranka.Priimek, Clan.Vclanjen as vclan
3 FROM Stranka
4 INNER JOIN Clan ON Stranka.idStranka = Clan.idStranka
5 INNER JOIN Letalisce ON Letalisce.idLetalisce = Clan.idLetalisce
6 WHERE Letalisce.NazivLetalisca = 'Letalisce 19';
SQL> SELECT MAX(vclan) FROM drugi;
SELECT MAX(vclan) FROM drugi
*
ERROR at line 1:
ORA-00904: "VCLAN": invalid identifier
SQL> DROP VIEW drugi
Asus G14 2023 - Ryzen 7940HS - 32GB DDR5 - GeForce RTX 4080 - 990 PRO 4TB
Tody ::
V tabeli stranka ne obstaja stolpec Clan.Vclanjen. Vrjetno si hotel vzet stolpec Vclanjen iz tabele clan.
Bolj kot gledam ta tvoj view bolj mi je čuden.
Teorija. V select oddelku poveš kaj boš izbral, tukaj ne vključuješ tabel, če imaš različna polja. Če imaš enaka polja (recimor ID) dodaš ime tabele, oz njen alias, toda POZOR. Te tabele moreš specificirat v from delu stavka. Potem pa uporabiš where stavek kjer poveš kako boš povezal medsebojne stolpce.
btw aliase ti ni treba uporabljat "as" ker zna oracle sam to narest, pa pridobiš pri preglednosti
Primer :
Bolj kot gledam ta tvoj view bolj mi je čuden.
Teorija. V select oddelku poveš kaj boš izbral, tukaj ne vključuješ tabel, če imaš različna polja. Če imaš enaka polja (recimor ID) dodaš ime tabele, oz njen alias, toda POZOR. Te tabele moreš specificirat v from delu stavka. Potem pa uporabiš where stavek kjer poveš kako boš povezal medsebojne stolpce.
btw aliase ti ni treba uporabljat "as" ker zna oracle sam to narest, pa pridobiš pri preglednosti
Primer :
select s.ID --> tukaj je alias od tabele spodaj Ime "ime člana", --> tukaj je pa alias stolpca, ki se bo prikazal ko boš dobil rezultat Priimek "priimek člana", Vclanjen "Datum včlanitve" from stranka s, clani c where stranka.id=clani.id
nuclear ::
Kaj pa če bi probal se drugi.Clan.Vclanjen?
Ne dela to, je isto ce das alias.
Tody, ne vem če si mi lih odgovoril na moje vprašanje..Odgovoril si mi neke osnove, nisi pa mi povedal dejansko rešitve kako pridobit podatek iz viewa s selectom. Bom probal brez tabelaričnih aliasov.. Glede na mssql delo, moram vedno postaviti tabela.kolumna, če imam več tabel joinanih, zato pišem ime_tabele.kolumna vedno.
Mogoče kak tip, kje ti je stavek najbolj čuden, ker ni poanta kako napišeš.. Prvi select brez viewa dela OK, vrne vse datume, ko pa hočem iz tega VIEWA pobrati tistega z zadnjim oz MAX datumom, pa neznam pobrat, ker neznam pravilno zahtevat kolumne.. Samo ta basic me j............... :)
thx za response vsem.
Asus G14 2023 - Ryzen 7940HS - 32GB DDR5 - GeForce RTX 4080 - 990 PRO 4TB
btree ::
čisto enostavno, ko selektiraš VCLAN, ti vrže error ORA-00904: "VCLAN": invalid identifier, kar pomeni, da stolpec ne obstaja. Napiši select * from drugi in poglej kako ti poimenuje stolpce.
Tody ::
ja basic zato ker maš v view dva selecta, ki sploh nista povezana med sabo, to tako ali tako ne more delovati, vsaj na oracle ne.
Tko da če že imaš narejen view potem ga selektiraj in boš videl imena stolpcev tako kot je rekel Tomaž. Potem pa ko boš vedel imen stolpcev
Select
max (ime_stolpca) "TO JE MAX"
from
ime view-a
Če viewa še nimaš se ga moreš drugače lotit kot si se ga.
Tko da če že imaš narejen view potem ga selektiraj in boš videl imena stolpcev tako kot je rekel Tomaž. Potem pa ko boš vedel imen stolpcev
Select
max (ime_stolpca) "TO JE MAX"
from
ime view-a
Če viewa še nimaš se ga moreš drugače lotit kot si se ga.
Zgodovina sprememb…
- spremenil: Tody ()
nuclear ::
Sploh nič ne vrne lol..
Dam tako..
Ko dam:
ne vrne nič, če dam pa samo brez viewa pa itak vrne..:
Fak ni mi nč jasn več...
Dam tako..
CREATE VIEW drugi AS SELECT Stranka.Ime, Stranka.Priimek, Clan.Vclanjen as vclan FROM Stranka INNER JOIN Clan ON Stranka.idStranka = Clan.idStranka INNER JOIN Letalisce ON Letalisce.idLetalisce = Clan.idLetalisce WHERE Letalisce.NazivLetalisca = 'Letalisce 19';
Ko dam:
SELECT * FROM drugi
ne vrne nič, če dam pa samo brez viewa pa itak vrne..:
SELECT Stranka.Ime, Stranka.Priimek, Clan.Vclanjen as vclan FROM Stranka INNER JOIN Clan ON Stranka.idStranka = Clan.idStranka INNER JOIN Letalisce ON Letalisce.idLetalisce = Clan.idLetalisce WHERE Letalisce.NazivLetalisca = 'Letalisce 19';
IME
---------------------------------------------
PRIIMEK VCLAN
--------------------------------------------- --------
Nina
Korošec 18.12.08
Blaž
Blatnik 13.12.03
Fak ni mi nč jasn več...
Asus G14 2023 - Ryzen 7940HS - 32GB DDR5 - GeForce RTX 4080 - 990 PRO 4TB
Tody ::
teb osnovni pojmi niso jasni. Zdravin tlačiš create view ti valda ne bo nič pokazal ker bo samo naredili view in ne bo vrnil podatkov. pa neke čudne povezave imaš na druge tabele vsaj za Oracle čudne.
nuclear ::
?
CREATE VIEW, in uporabim select... poberem potem iz viewa s selectom, ne vem če trolaš ampak....? Meni kao niso osnovni pojmi jasni, tebi so pa INNER JOIN povezave čudne(pač ne delam z WHERE povezav med tablami). d0h no..
Evo potem pa mi prosim že enkrat napiši pravilen stavek po tem primeru.. Skos govoriš, čudno ovo, čudno ono, ceu stavek čudn, da bi pa popravil stavek pa neznaš.. Sorry no nvem več al trolaš al sploh kej znaš. Če znaš, sorry, sam men ne kažeš tega znanja, da bi lahko pomagal kakorkoli..
i don't even,... eh :rolleyes
CREATE VIEW, in uporabim select... poberem potem iz viewa s selectom, ne vem če trolaš ampak....? Meni kao niso osnovni pojmi jasni, tebi so pa INNER JOIN povezave čudne(pač ne delam z WHERE povezav med tablami). d0h no..
Evo potem pa mi prosim že enkrat napiši pravilen stavek po tem primeru.. Skos govoriš, čudno ovo, čudno ono, ceu stavek čudn, da bi pa popravil stavek pa neznaš.. Sorry no nvem več al trolaš al sploh kej znaš. Če znaš, sorry, sam men ne kažeš tega znanja, da bi lahko pomagal kakorkoli..
i don't even,... eh :rolleyes
Asus G14 2023 - Ryzen 7940HS - 32GB DDR5 - GeForce RTX 4080 - 990 PRO 4TB
Tody ::
Nuclear lepo sem ti spisal stavek pa ti ni bil všeč. Nimam izkušenj z MS zadevami zato ti lahko povem samo za oracle.
Vsakič ko napišeš CREATE VIEW on naredi nov VIEW vrjetno ti vsakič tudi vrže napako da drugi VIEW že obstaja. Ta funkcija NE vrne podatkov, ker je njena funkcija da naredi view iz selecta, ki si mu ga dal. Če hočeš potem dobit podatke ven moreš uporabit select * from drugi
Select
ime
priimek
vclanjen
from
stranka,
clan,
lestalisce
where
stranka.idstranka=clan.idstranka
and letalisce.idletalisce=clan.idletalisce
and
nazivletalisca='Letalisce 19'
Zdej če so imena stolpcev prava pa nevem. Če ti pravi da je napačen indetifaijer si se ali zatipkal ali tega stolpca ni v tisti tabeli v kateri si ga poslal iskat. Druge možnosti NI! Lahko edino še probaš velike male črke ali kaj takega. Ko ti select dela tako kot hočeš pa lahko spremeniš ta select v view in potem dostopaš do teh podatkov preko view-a.
Vsakič ko napišeš CREATE VIEW on naredi nov VIEW vrjetno ti vsakič tudi vrže napako da drugi VIEW že obstaja. Ta funkcija NE vrne podatkov, ker je njena funkcija da naredi view iz selecta, ki si mu ga dal. Če hočeš potem dobit podatke ven moreš uporabit select * from drugi
Select
ime
priimek
vclanjen
from
stranka,
clan,
lestalisce
where
stranka.idstranka=clan.idstranka
and letalisce.idletalisce=clan.idletalisce
and
nazivletalisca='Letalisce 19'
Zdej če so imena stolpcev prava pa nevem. Če ti pravi da je napačen indetifaijer si se ali zatipkal ali tega stolpca ni v tisti tabeli v kateri si ga poslal iskat. Druge možnosti NI! Lahko edino še probaš velike male črke ali kaj takega. Ko ti select dela tako kot hočeš pa lahko spremeniš ta select v view in potem dostopaš do teh podatkov preko view-a.
Zgodovina sprememb…
- spremenil: Tody ()
nuclear ::
Tody naredim VIEW in potem hkrati kot vidiš select.. Kolikor razumem viewe so shranijo potem notri v view podatki, da jih lahko potem ven selectaš... ta query ki si ga napisal, dam noter v VIEW, ko pa hočem "select * from drugi", torej selectat IZ VIEWA pa mi ničesar ne izpiše. Ravno zato mi je čudno. Nič bom vprašal asistente.
hvala za sodelovanje in čas!
hvala za sodelovanje in čas!
Asus G14 2023 - Ryzen 7940HS - 32GB DDR5 - GeForce RTX 4080 - 990 PRO 4TB
Tody ::
Če ti dela select, bi ti moral tudi view. Če ti tudi select ne vrne podatkov, sva mogoče napačno povezala tabele ali pa je where pogoj takšen da za to ni podatkov. Letalisce 19 je specifičen pogoj, če notri ni točno tako napisano ti ne bo vrnil zadetka. Lako probaš
where
nazivletalisca like upper('letalisce%') pa ti bo selectiral vse letališča neglede na številko in neglede na velike/male začetnice.
Ko se prepričaš kako je je letališčce zapisano pa lahko daš nazaj točno tak pogoj.
where
nazivletalisca like upper('letalisce%') pa ti bo selectiral vse letališča neglede na številko in neglede na velike/male začetnice.
Ko se prepričaš kako je je letališčce zapisano pa lahko daš nazaj točno tak pogoj.
zdravc ::
Zdravo vsem skupaj.
Vidim, da imaste nekaj težav z osnovnimi pojmi.
View, (lahko bi slovensko rekli pogled) je samo logična definicija poizvedbe nad podatki.
Sam zase ne vsebuje podatkov kot npr. tabela.
Ko se izvede select ukaz na view, se v ozadju izvede select definiran v viewu, njegov rezultat
pa vstopa v prvi select kot podatki iz tabel.
Struktura tabela.polje ali alias.polje se uporablja v primerih zdruzevanja podatkov iz vec tabel (join)
v isti poizvedbi, kadar v vsaj dveh tabelah nastopajo polja z istim imenom.
Primer poizvedbe iz prometa, kjer je potrebno sifri kupca dodati naziv iz sifranta :
Select prom.kupec,kupci.naziv,prom.kol
from kupci, prom
where prom.leto = 2010
and kupci.sifra = prom.sifra
Ce bi za isti primer rabil prikazati samo promet tistih kupcev, katerih skupna kolicina v letu 2010 je večja
kot npr. 100, bi uporabil vgnezden select (znotraj oklepajev) :
Select prom.kupec,kupci.naziv,prom.kol
from kupci, prom
where prom.leto = 2010 and kupci.sifra = prom.sifra
and 100 <
(select sum(x.kol) from prom x
where x.leto= prom.leto and x.kupec = prom.kupec)
Za vgnezden select sem uporabil alias (x) zaradi enakih polj in ker tabela prom ze nastopa v nadrejenem selectu.
Ce se taksna poizvedba veckrat uporablja oz. ce rabis v maski, se za ta namen kreira view.
Najbolj pogosto se uporabljajo viewi za povezovanje prometnih podatkov s sifranti za prikazovanje nazivov in drugih
parametrov iz sifrantov, kot tudi za bolj kompleksne poizvedbe. Omejitev prakticno ni.
Vidim, da imaste nekaj težav z osnovnimi pojmi.
View, (lahko bi slovensko rekli pogled) je samo logična definicija poizvedbe nad podatki.
Sam zase ne vsebuje podatkov kot npr. tabela.
Ko se izvede select ukaz na view, se v ozadju izvede select definiran v viewu, njegov rezultat
pa vstopa v prvi select kot podatki iz tabel.
Struktura tabela.polje ali alias.polje se uporablja v primerih zdruzevanja podatkov iz vec tabel (join)
v isti poizvedbi, kadar v vsaj dveh tabelah nastopajo polja z istim imenom.
Primer poizvedbe iz prometa, kjer je potrebno sifri kupca dodati naziv iz sifranta :
Select prom.kupec,kupci.naziv,prom.kol
from kupci, prom
where prom.leto = 2010
and kupci.sifra = prom.sifra
Ce bi za isti primer rabil prikazati samo promet tistih kupcev, katerih skupna kolicina v letu 2010 je večja
kot npr. 100, bi uporabil vgnezden select (znotraj oklepajev) :
Select prom.kupec,kupci.naziv,prom.kol
from kupci, prom
where prom.leto = 2010 and kupci.sifra = prom.sifra
and 100 <
(select sum(x.kol) from prom x
where x.leto= prom.leto and x.kupec = prom.kupec)
Za vgnezden select sem uporabil alias (x) zaradi enakih polj in ker tabela prom ze nastopa v nadrejenem selectu.
Ce se taksna poizvedba veckrat uporablja oz. ce rabis v maski, se za ta namen kreira view.
Najbolj pogosto se uporabljajo viewi za povezovanje prometnih podatkov s sifranti za prikazovanje nazivov in drugih
parametrov iz sifrantov, kot tudi za bolj kompleksne poizvedbe. Omejitev prakticno ni.
kdor zna pa žih
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | TSQL rekurzivnoOddelek: Programiranje | 918 (657) | hamez66 |
» | [SQL] teževa pri iskanju zapisovOddelek: Programiranje | 2115 (1705) | lopow |
» | Podatkovne baze - SQL enostavne poizvedbeOddelek: Programiranje | 2075 (1668) | galu |
» | Baza & c#Oddelek: Programiranje | 4174 (3232) | xardas |
» | SQL poizvedbaOddelek: Programiranje | 2172 (1682) | borchi |