[ sovabass @ 14.09.2011. 14:43 ] @
Pozdrav.

Potrebna mi je pomoc oko izrade upita.Postoje tabela1 i tabela2. Zelim da mi iz tabele1.colona1 izvlaci vrijenosti iz colone 1 i utvrdjuje da li se nalazi u opsegu vrijednosti izmedju kolona tabela2.colona 1 i tabela2.colona2. Upit bi trebao da izgleda kao:

select * from table2 where tabela1.colona1 between tabela1.col003 and tabela1.col004

medjutim MSSQL 2008 prijavljuje gresku vracanja multiplikovanih vrijednosti.

Zatim sam pokusao sa ogromnim upitom npr.:

select * from tabela1 where 785044919 between col003 and col004 union all
select * from tabela1 where 1838277475 between col003 and col004 union all
select * from tabela1 where 459937403 between col003 and col004 union all
select * from tabela1 where 1841745892 between col003 and col004 union all
select * from tabela1 where 1838864327 between col003 and col004 union all

gdje su crvenom bojom vrijednosti iz tabela1.colona1.Medjutim,ni ovo ne ide jer premasuje memoriju. :( Inace tabela1 ima oko 2 500 000 redova a tabela2 oko 200 000.

Molim za prijedlog oko konstruisanja upita?
[ nadavesela @ 14.09.2011. 15:04 ] @
Malo ti je konfuzno postavljeno pitanje sa tabelom1, tabelom2, kojim kolonama.
Mozda ako das scriptu tabela budemo mogli i konkretno da ti resimo.
probaj sa computed kolonom koja preko UDF vraca odgovarajucu vrednost (1 ako je izmedju colone3 i kolone4 , 0 ako nije)za dati red.
Posle samo radis select * from tabele where computedkolona=1.
Neki primer computed kolona i UDF imas u http://www.elitesecurity.org/t...vanje-razlike-izmedju-dva-reda
[ sovabass @ 15.09.2011. 08:59 ] @
Hvala Nado na odgovoru,medjutim,opcija koju si predlozila ne ispunjava zahtjeve.

Pokusacu pojasniti. U prvoj tabeli ipnuber ,koja je ispis logova sa servera,nalaze se kolone sa IPadresama i nazivima drzava iz koji poticu ,medjutim, u koloni sa drzavama nalaze se upitnici,nepoznato je. Cilj mi je da utvrdim iz koje drzave potice odredjena IPadresa,tj.da updatujem tu kolonu. Za to mi je potrebna geoIP tabela gdje se nalaze kolone pocetne i krajnje adrese (opseg adresa koji se koristi u odredjenoj drzavi) i naziv drzave.Trebao bih da:

Utvrdim u kojem opsegu se nalaze IP adrese iz tabele ipnumber .npr:

Select * from geoIP where ipnumber. ipadresa between pocadresa and krajadresa

Ovdje mi ispisuje redove tabele geoIP ,gdje je u trecoj koloni naziv drzave. E,sad,potrebna mi je skripta koja ce ovo raditi automatizovano,tj.

1.da svaku vrijednost iz kolone ipadrese ispita u geoip tabeli
2.odredi opseg u kom se nalazi
3.kada pronadje taj opseg,da vrijednost kolone drzava iz geo IP tabele upise u kolonu drzava u tabeli IP number.


Primjer tabele ip number:

create table ipnumber
(
id varchar (50),
ipadresa varchar (50),
Col003 varchar (50),
drzava varchar (50),
Col005 varchar (50),
Col006 varchar (50),
os varchar (50),
sp varchar (50),
datum datetime,
Col010 varchar (50),
Col011 nchar (50),
)

INSERT INTO ipnumber values (1, 785044919 ,4566 ,'??', 'Y' , 'Y' ,'WinXP' ,'SP3' ,'5.8.2011 8:26:09 ' ,'241 ,'N')
INSERT INTO ipnumber values (4, 1838277475 ,3751 ,'??', 'Y' ,'Y' ,'WinXP' ,'SP3' ,'2.8.2011 18:21:57' ,'215' ,'N')
INSERT INTO ipnumber values (6 ,459937403 ,61395 ,'??', 'Y' ,'Y' ,'WinXP' ,'SP3' ,'5.8.2011 9:43:49' ,'241' ,'N')
INSERT INTO ipnumber values (8 ,1841745892 ,1370 ,'??', 'Y' ,'Y' ,'WinXP' ,'SP2' ,'5.8.2011 10:03:39' ,'241' ,'N')


Primjer tabele geoip:


create table geoip2
(
pocadresa varchar (50),
krajadresa varchar (50),
drzava varchar (50),
)

INSERT INTO geoip values (16777216 ,16777471 ,'AU')
INSERT INTO geoip values (16777472 ,16778239 ,'CN')
INSERT INTO geoip values ( 16778240 ,16779263 ,'AU')
INSERT INTO geoip values (16779264 ,16781311 ,'CN')

Primjer kako bi trebalo da izgleda vrijednost tabele ipnumber,kolona drzava:

create table ipnumber1
(
id varchar (50),
ipadresa varchar (50),
Col003 varchar (50),
drzava varchar (50),
Col005 varchar (50),
Col006 varchar (50),
os varchar (50),
sp varchar (50),
datum varchar (50),
Col010 varchar (50),
Col011 varchar (50),
)

INSERT INTO ipnumber1 values (1, 785044919 ,4566 ,'CN', 'Y' ,'Y' ,'WinXP' ,'SP3' ,'5.8.2011 8:26:09 ' ,241 ,'N')
INSERT INTO ipnumber1 values (4, 1838277475 ,3751 ,'TH', 'Y' ,'Y' ,'WinXP' ,'SP3' ,'2.8.2011 18:21:57' ,215 ,'N')
INSERT INTO ipnumber1 values (6, 459937403 ,61395 ,'US', 'Y' ,'Y' ,'WinXP' ,'SP3' ,'5.8.2011 9:43:49' ,241 ,'N')
INSERT INTO ipnumber1 values (8 ,1841745892 ,1370 ,'AU', 'Y' ,'Y' ,'WinXP' ,'SP2' ,'5.8.2011 10:03:39' ,241 ,'N')
[ nadavesela @ 15.09.2011. 09:41 ] @
udf koju mozda trebas prilagoditi, zbog uslova uporedjivanja :

CREATE FUNCTION [dbo].[fn_IpAdresaDrzava](@IpAdresa AS varchar(50))
RETURNS varchar(50)
AS
BEGIN
DECLARE @Ipdrzava as varchar(50)
SET @Ipdrzava =(SELECT geoip2.drzava FROM dbo.geoip2 WHERE pocadresa<[email protected] and krajadresa>[email protected])
RETURN (@Ipdrzava)
END

computed kolona:

ALTER TABLE ipnumber
ADD [IpDrzava] AS [dbo].[fn_IpAdresaDrzava([ipadresa])]

prikaz:
SELECT * FROM ipnumber

ako moras
UPDATE tabele ipnumber zbog kolone drzava
onda :
UPDATE ipnumber
set drzava=Ipdrzava


[Ovu poruku je menjao nadavesela dana 15.09.2011. u 11:07 GMT+1]
[ sovabass @ 15.09.2011. 11:02 ] @
Ali savrseno,to je to.

Nado,hvala ti puno,ne znam sta vise reci. :)