locked
sorok kifektetese es osszefuzese egyetlen mezobe sok rekordon RRS feed

  • Question

  • a feladat az lenne, hogy ez nagyon gyors legyen :)

    create table t (id int, mezo varchar(max) null, tip int)
    create table tt (id int, tip int, mezo varchar(max), nev varchar(max))
    
    insert into tt Select 1,1,'a','n1'
    insert into tt Select 2,1,'b','n2'
    insert into tt Select 3,1,'c','n3'
    insert into tt Select 4,1,'d','n4'
    
    insert into tt select 5,2,'G','n1'
    insert into tt select 6,2,'H','n3'
    insert into tt select 7,2,'I','n4'
    
    insert into t select 1,null,1
    insert into t select 2,null,2
    insert into t select 3,null,2
    insert into t select 4,null,1
    
    create clustered index i1 on tt (tip, id)
    go
    create function gm(@tip int) returns varchar(max)
    as
    begin
    	declare @ret varchar(max)
    	select @ret = isnull(@ret,'') + Nev+':'+Mezo+','
    	from tt where tip = @tip
    	return @ret
    end
    go
    -- update t set mezo = null
    update a
    set mezo = dbo.gm(tip)
    from t as a
    
    select * from t
    
    /*
    id	mezo	tip
    1	n1:a,n2:b,n3:c,n4:d,	1
    2	n1:G,n3:H,n4:I,	2
    3	n1:G,n3:H,n4:I,	2
    4	n1:a,n2:b,n3:c,n4:d,	1
    */
    
    

    ami miatt most lassu

    , az az hogy a tt az igazabol egy view ami tobb adatbazisban levo azonos tablakat fog ossze valahogy igy:

    create view tt 
    as
    select * from db2000.dbo.tt
    union all
    select * from db2001.dbo.tt
    union all
    select * from db2002.dbo.tt
    ...
    select * from db2009.dbo.tt
    
    

    ezek a tablak nagyok

    (2-3 millio rekord tablankent)

    nekem keves rekordhoz tartozo adat kell

    (a T tablaba par ezer rekord van, tehat a TT-bol par tizezer rekord kell csak osszesen)

    DE en tudom

    , hogy melyik evekbol kene az adat (mert altalaban csak 1-2 egymast koveto evrol van szo pl 2005+2006)

    DE fgvben nem lehet dinamikus sqlt hasznalni

    .:(

    tehetnek bele egy nagy

    IF et hogy melyik evekbol kerek adatot:

    if

     

    ev = 2000

    select

    .... from db2000...

    else

     

    if ev = 2001

    select

    .... from db2001...

    de ezzel meg az a baj

    , hogy amikor uj ev nyilik, akkor modositani kene ezt a fgvt is

    (

     

    ami perpill nem megy automatikusan, mig az uj ev nyitasa automatikusan megy, persza ha as nincs, akkor megoldjuk hogy modosuljon ez a fgv uj ev nyitasakor...)

    Gyakorlatilag a feladat sorok kifektetese es osszefuzese egyetlen mezobe sok rekordon

    :)

    mert ha ez menne

    :

    update

     

    a

    set

     

    mezo = a.mezo + b.nev+':'+b.mezo+','

    from

     

    t as a

    join

     

    tt as b

     

    on t.tip = tt.tip

    akkor minden jo lenne

    :) de ez csak ugye az elso rekordot teszi bele, nem fuzi hozza a tobbit.

    (

     

    mert ezt meg tudom irni dinamikus SQL-re (a TT helyett dbXXXX) magaban az eljarasban ami amugy hivogatna a fgvt)


    Potyos
    Thursday, October 28, 2010 8:06 AM

All replies

  • Szerintem sokkal gyorsabb, ahogy te hasznaltad, de 1 próbát megér:

     

    select mezo = dbo.gm(tip)

    from t as a

     

    SELECT  (

    SELECT Nev+':'+Mezo+','

    FROM tt

    WHERE tt.tip = t.tip

    FOR XML PATH(''))

    FROM t

     

    SELECT  zz.*

    FROM t

    CROSS APPLY (

    (

    SELECT Nev+':'+Mezo+','

    FROM tt

    WHERE tt.tip = t.tip

    FOR XML PATH(''))

    ) zz ( tip )

    Tuesday, November 2, 2010 11:37 PM
    Moderator