» »

[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 '%{}%'

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.

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.

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

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

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…

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

prozac je izjavil:

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

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

[SQL] Filtriranje

Oddelek: Programiranje
7898 (653) korenje3
»

[SQL] Pohitritev izpisa

Oddelek: Programiranje
252881 (1780) kuall
»

[SQL] dvojni klic potratne funkcije?

Oddelek: Programiranje
101040 (669) prozac
»

PHP pridobivanje podatkov iz dveh tabel po tujem ključu

Oddelek: Izdelava spletišč
141155 (923) SkIDiver
»

[Oracle] Osnovno povpraševanje problem

Oddelek: Programiranje
151898 (1539) zdravc

Več podobnih tem