Forum » Programiranje » [SQL] teževa pri iskanju zapisov
[SQL] teževa pri iskanju zapisov
lopow ::
Pozdravljeni, imam sledečo težavo. V postgres bazi imam podatke o osebah, poleg njih je tudi GURS-podatek OBČINA, NASLJE, MESTO, ULICA. S select stavkom potem iščem po ulicah.
Težava je, da v koliko izberem enobesedno ulica npr. LJUBLJANA, LJUBLJANA, KRIVEC, dobim rezultate, v kolikor pa izberem npr. LJUBLJANA, LJUBLJANA, ULICA BRATOV UČAKAR, pa ne dobim zapisov, del sql stavka je sledeč:
SELECT
uporabnik.sifra_stara,
uporabnik.naziv_1,
uporabnik.naslov,
FROM
"uporabnik
WHERE
uporabnik.rpe_obcina ILIKE '%{}%'
AND
uporabnik.rpe_naselje ILIKE '%{}%'
AND
uporabnik.rpe_ulica ILIKE '%{}%'
Težava je, da v koliko izberem enobesedno ulica npr. LJUBLJANA, LJUBLJANA, KRIVEC, dobim rezultate, v kolikor pa izberem npr. LJUBLJANA, LJUBLJANA, ULICA BRATOV UČAKAR, pa ne dobim zapisov, del sql stavka je sledeč:
SELECT
uporabnik.sifra_stara,
uporabnik.naziv_1,
uporabnik.naslov,
FROM
"uporabnik
WHERE
uporabnik.rpe_obcina ILIKE '%{}%'
AND
uporabnik.rpe_naselje ILIKE '%{}%'
AND
uporabnik.rpe_ulica ILIKE '%{}%'
ales85 ::
Morda je težava pri ulicah. Če to delaš preko kakšnega spletnega vmesnika, poskusi vsebino ulice razbiti na več parametrov, ki se morajo vsi ujemati. Problem je lahko že pri "ULICA", ker bi lahko bilo v bazi zapisano kot "U." (odvisno kakšno bazo imaš).
Torej predlagam, da "ULICA BRATOV UČAKAR" razbiješ tako:
SELECT
uporabnik.sifra_stara,
uporabnik.naziv_1,
uporabnik.naslov,
FROM
"uporabnik
WHERE
uporabnik.rpe_obcina ILIKE '%{}%'
AND
uporabnik.rpe_naselje ILIKE '%{}%'
AND
uporabnik.rpe_ulica ILIKE '%{ULICA}%'
AND
uporabnik.rpe_ulica ILIKE '%{BRATOV}%'
AND
uporabnik.rpe_ulica ILIKE '%{UČAKAR}%'
Split pa lahko narediš s preslednico in uporabiš polje nizov za SQL.
EDIT: S tem dosežeš to, da je lahko vrstni red kakršen koli. Kot dodatek, zaradi ročnega vpisovanja, pa bi lahko uporabil še kakšno orodje za popravljanje napak (neke vrste permutacije), ki v bistvu vrne približke. Odvisno kako točne imaš vhode.
Torej predlagam, da "ULICA BRATOV UČAKAR" razbiješ tako:
SELECT
uporabnik.sifra_stara,
uporabnik.naziv_1,
uporabnik.naslov,
FROM
"uporabnik
WHERE
uporabnik.rpe_obcina ILIKE '%{}%'
AND
uporabnik.rpe_naselje ILIKE '%{}%'
AND
uporabnik.rpe_ulica ILIKE '%{ULICA}%'
AND
uporabnik.rpe_ulica ILIKE '%{BRATOV}%'
AND
uporabnik.rpe_ulica ILIKE '%{UČAKAR}%'
Split pa lahko narediš s preslednico in uporabiš polje nizov za SQL.
EDIT: S tem dosežeš to, da je lahko vrstni red kakršen koli. Kot dodatek, zaradi ročnega vpisovanja, pa bi lahko uporabil še kakšno orodje za popravljanje napak (neke vrste permutacije), ki v bistvu vrne približke. Odvisno kako točne imaš vhode.
Zgodovina sprememb…
- spremenil: ales85 ()
joze67 ::
Pričakoval bi, da OP ve, kaj piše v bazi. In da je poskusil tudi s kako drugo ulico, tako da ni težavav šumnikih.
Za začetek naj OP poskusi z direktnim klicem: ... and rpe_ulica like '%ULICA BRATOV UČAKAR%
Če to dela... bo potrebno preveriti, zakaj ga pri zamenjavi parametra motijo presledki. Če ne dela, naj presledke zamenja s '\s' in poskusi.
Itd. V bistvu s Postgres nimam izkušenj, to so splošne smernice, kako reševati problem.
Za začetek naj OP poskusi z direktnim klicem: ... and rpe_ulica like '%ULICA BRATOV UČAKAR%
Če to dela... bo potrebno preveriti, zakaj ga pri zamenjavi parametra motijo presledki. Če ne dela, naj presledke zamenja s '\s' in poskusi.
Itd. V bistvu s Postgres nimam izkušenj, to so splošne smernice, kako reševati problem.
lopow ::
Hvala za predlgoge, mi je pa v bistvu kapnilo in sem zadevo rešil tako, da sedaj ko izberem niz npr. ulica bratov učakar, potem presledke zamenjam s procenti in zadeva deluje.
lopow ::
No to sem uredil in že sem pred novim problemom. Zadeva je sledeča:
imam tabelo uporabniki in tablo opravljenih storitev. Za enaga uporabnika imamo več opravljanih storitev. Pri izpisu pa bi rad samo izpis zadnje storitve, sevad pa mi mora pokazati tudi tiste uporabnike, ki nimajo opravljanjih storitev.
do sedaj sem uspel, da sem dobil izpisi uporabnikov z zadnjimi storitvami, vendar pa mi tistih uporabnikov, ki v tabeli storitve nimajo zapisov ne pokaže.
moj sql:
imam tabelo uporabniki in tablo opravljenih storitev. Za enaga uporabnika imamo več opravljanih storitev. Pri izpisu pa bi rad samo izpis zadnje storitve, sevad pa mi mora pokazati tudi tiste uporabnike, ki nimajo opravljanjih storitev.
do sedaj sem uspel, da sem dobil izpisi uporabnikov z zadnjimi storitvami, vendar pa mi tistih uporabnikov, ki v tabeli storitve nimajo zapisov ne pokaže.
moj sql:
SELECT uporabnik.sifra_stara, uporabnik.naziv_1, uporabnik.naslov, fakture_vasco.datum_storitve, fakture_vasco.znesek, zaposleni.priimek_ime FROM uporabnik LEFT JOIN fakture_vasco ON uporabnik.sifra_stara = fakture_vasco.sifra_kupca LEFT JOIN zaposleni ON zaposleni.stara_sifra = "fakture_vasco.izvajalec WHERE uporabnik.rpe_obcina ILIKE 'KAMNIK' AND uporabnik.rpe_naselje ILIKE 'KAMNIK' AND uporabnik.rpe_ulica ILIKE 'NEVLJE%' AND fakture_vasco.datum_storitve =( SELECT max(fakture_vasco.datum_storitve) FROM fakture_vasco WHERE uporabnik.sifra_stara = fakture_vasco.sifra_kupca) ORDER BY uporabnik.naslov ASC
Zgodovina sprememb…
- spremenil: lopow ()
prozac ::
sicer za postgre ne vem kako gre, ker uporabljam le Oracle bazo, ampak jst bi:
1. zapise v tabeli fakture_vasco rangiral, tako da bi dobil za vsakega izvajalec zadnji zapis
select izvajalec, datum_storitve from (
select row_number() over (partition by izvajalec order by datum_storitve desc) as rnk, izvajalec, datum_storitve
from fakture_vasco
) where rnk = 1
2. potem bi to tabelo left join na uporabnik inbi mogu dobit vse zapise
mislm da ce uporabljas left join sintakso namesto (+) potem ne smes v where narest filtra na polje iz left tabele, ker ti potem naredi inner join samo nism 100% da je to res
1. zapise v tabeli fakture_vasco rangiral, tako da bi dobil za vsakega izvajalec zadnji zapis
select izvajalec, datum_storitve from (
select row_number() over (partition by izvajalec order by datum_storitve desc) as rnk, izvajalec, datum_storitve
from fakture_vasco
) where rnk = 1
2. potem bi to tabelo left join na uporabnik inbi mogu dobit vse zapise
mislm da ce uporabljas left join sintakso namesto (+) potem ne smes v where narest filtra na polje iz left tabele, ker ti potem naredi inner join samo nism 100% da je to res
Zgodovina sprememb…
- spremenilo: prozac ()
lopow ::
Evo, prvi del sem uspel, tako da dobim samo zadnje datume, vendar pa mi nikakor ne gre potem left joina s tabelo uporabniki.
prvi del imam tako
prvi del imam tako
SELECT * FROM (SELECT fakture_vasco.sifra_kupca, fakture_vasco.datum_storitve, rank() OVER ( PARTITION BY sifra_kupca ORDER BY datum_storitve DESC) FROM fakture_vasco) sub_query WHERE rank = 1
OracleDev ::
SELECT * FROM uporabnik left outer join (SELECT fakture_vasco.sifra_kupca, first_value(fakture_vasco.datum_storitve) OVER ( PARTITION BY sifra_kupca, datum_storitve ORDER BY datum_storitve DESC) datum_storitve FROM fakture_vasco) sub_query on uporabnik.sifra_stara = sub_query.sifra_kupca
Sicer sm napisu "na pamet" ampak mislm da boš razumu, tudi če sem se kje zmotil. Uporabu sm first_value in kot osnovo vzel tabelo uporabniki (če prav razumem hočeš dobiti vse uporabnike) in nato zvezal z tabelo faktur (če obstaja).
Zgodovina sprememb…
- spremenil: OracleDev ()
lopow ::
Hvala, to sem rabil. Vendar pa ker tako zapletenih SQL stavkov še nisem delal, se še malo lovim, čeprav mi je jasno, ampak bi pa prosil še kako naj sedaj dobljeno tavelo, ker omejim, da mi pokaže samo določene stolpce, ne pa vseh, ker če namesto zvezdice napišem imena stolpcev, mi jih napiše samo iz tabele uporabniki, ne pa iz subquerya?
prozac ::
kaj ti pa napise ce izvedes:
SELECT sub_query.* FROM uporabnik left outer join (SELECT fakture_vasco.sifra_kupca, first_value(fakture_vasco.datum_storitve) OVER ( PARTITION BY sifra_kupca, datum_storitve ORDER BY datum_storitve DESC) datum_storitve FROM fakture_vasco) sub_query on uporabnik.sifra_stara = sub_query.sifra_kupca
lopow ::
kaj ti pa napise ce izvedes:
SELECT sub_query.*
FROM uporabnik
left outer join
(SELECT
fakture_vasco.sifra_kupca,
first_value(fakture_vasco.datum_storitve) OVER (
PARTITION BY sifra_kupca, datum_storitve
ORDER BY datum_storitve
DESC) datum_storitve
FROM fakture_vasco) sub_query on uporabnik.sifra_stara = sub_query.sifra_kupca
to kar sem hotel :)
Hvala
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [SQL] FiltriranjeOddelek: Programiranje | 898 (653) | korenje3 |
» | [SQL] Pohitritev izpisaOddelek: Programiranje | 2881 (1780) | kuall |
» | [SQL] dvojni klic potratne funkcije?Oddelek: Programiranje | 1040 (669) | prozac |
» | PHP pridobivanje podatkov iz dveh tabel po tujem ključuOddelek: Izdelava spletišč | 1155 (923) | SkIDiver |
» | [Oracle] Osnovno povpraševanje problemOddelek: Programiranje | 1898 (1539) | zdravc |