Query ricerca NULL [RISOLTO]

di il
6 risposte

Query ricerca NULL [RISOLTO]

Buonasera a tutti,

un saluto è doveroso visto che mi son appena iscritto.

Mi sta facendo impazzire una situazione che per gli esperti è ridicola...ma mi serve aiuto

Ho una tabella A così formata

DESCRIZIONE.......UNIQUE_ID
ROSSI...................1
ROSSI 1.................2
ROSSI 2.................3
BIANCHI.................4
BIANCHI 1 ............. 5
VERDI................... 6

E una tabella B che fa da PARENT CHILD

PARENT_ID.......CHILD_ID
....1................. 2
.....1................. 3
.....4................. 5

Dovrei riscostruire l'albero in un TreeView in .NET e la prima cosa che devo fare è una query.
L'albero è il seguente:

ROSSI
.......ROSSI 1
.......ROSSI 2
BIANCHI
.......BIANCHI 1
VERDI

Per trovare i PADRI della radice del TreeView devo fare un SELECT DESCRIZIONE e prendere l'UNIQUE_ID e andare a vedere nella tabella B quando questo UNIQUE_ID non c'è nel campo CHILD_ID.

Qui mi son fermato....aiuto.

Grazie mille!!

6 Risposte

  • Re: Query ricerca NULL [RISOLTO]

    Dal poco che interpreto vuoi fare una left join negata.
    visto che suppongo non avrai problemi di prestazioni puoi fare una lista e usare not in
  • Re: Query ricerca NULL [RISOLTO]

    Scusa, ma cosa c'entra il Treeview con SQL Server?
    E' un problema da .NET (ma poi devi ANCHE postare nella sezione del linguaggio corretto).
    Chiedi (segnala) al moderatore che ti sposti nella sezione giusta.
  • Re: Query ricerca NULL [RISOLTO]

    Con il treeview mi arrangio io come pure con vb.net. Ho postato qui perché son quasi certo che la lista si faccia con una query secca (credo inner join negata). Se dovessi farlo da .net dovrei farmi restituire due array ed iterare...con migliaia di record non è proprio un bel lavoro.
  • Re: Query ricerca NULL [RISOLTO]

    eidii ha scritto:


    Ho postato qui perché son quasi certo che la lista si faccia con una query secca (credo inner join negata).
    Tu credi che sia sufficiente?

    eidii ha scritto:


    Se dovessi farlo da .net dovrei farmi restituire due array ed iterare...con migliaia di record non è proprio un bel lavoro.
    Invece con la 'query secca' come popoleresti un treeview?
  • Re: Query ricerca NULL [RISOLTO]

    Salve,
    non riesco a postare con i tag di codice, e provo in plain text, quindi sara' formattato male...

    non ho ben capito cosa in effetti cerchi di fare... @+m2+ ha probabilmente centrato il concetto, cioe' effettuare una proiezione che escluda le righe referenzianti nella tabella di "relazione" la riga da considerarsi "parent"...
    questo, semplicemente, puo' essere ottenuto come
    PRINT 'tutti i parent';
    SELECT parent.[UNIQUE_ID], parent.[Descrizione]
    FROM [dbo].[t] parent
    LEFT JOIN [dbo].[t_t] child ON child.[IdChild] = parent.[UNIQUE_ID]
    WHERE child.[IdParent] IS NULL;
    -------------
    tutti i parent
    UNIQUE_ID Descrizione
    ----------- -----------
    1 ROSSI
    4 BIANCHI
    6 VERDI

    la proiezione "normale" completa e' ovviamente invece una semplice outer join, ordinabile sicuramente per la relazione parent-child, quindi non c'e' niente da indicare...

    poi potresti aver chiesto anche "altre cose", ma come dicevo, non mi e' chiara la richiesta, tipo ad esempio una rapprestanzione "testuale" ad albero delle relazioni parent-child come in un "treeview",
    Parent
    --- Child
    --- Child
    Parent
    --- Child
    ed anche qui non e' particolarmente complicato in quanto la popolazione dei dati prevederebbe (nell'esempio) 2 soli livelli, e quindi e' gestibile anche con una costante, ma si puo' ovviamente anche scrivere una query ricorsiva tipo
    PRINT 'rappresentazione "testuale" parent/children';
    WITH ctePar AS (
    SELECT parent.[UNIQUE_ID], parent.[Descrizione]
    , parent.[UNIQUE_ID] AS [ref], 1 AS [lvl]
    FROM [dbo].[t] parent
    LEFT JOIN [dbo].[t_t] child ON child.[IdChild] = parent.[UNIQUE_ID]
    WHERE child.[IdParent] IS NULL
    UNION ALL
    SELECT child.[UNIQUE_ID], child.[Descrizione]
    , parent.[UNIQUE_ID] AS [ref], parent.[lvl] + 1
    FROM ctePar parent
    JOIN [dbo].[t_t] tt ON tt.[IdParent] = parent.[UNIQUE_ID]
    JOIN [dbo].[t] child ON child.[UNIQUE_ID] = tt.[IdChild]
    )
    SELECT c.[UNIQUE_ID]
    , REPLICATE ( '--', c.[lvl] -1) + ' ' + c.[Descrizione] AS [shifter]
    FROM ctePar c
    ORDER by c.[ref], c.[lvl], c.[UNIQUE_ID];
    -----------
    rappresentazione "testuale" parent/children
    UNIQUE_ID shifter
    ----------- ----------------------------------
    1 ROSSI
    2 -- ROSSI1
    3 -- ROSSI2
    4 BIANCHI
    5 -- BIANCHI1
    6 VERDI

    dipende tutto da "cosa" desideri ottenere...
    saluti omnia
    --
    Andrea
  • Re: Query ricerca NULL [RISOLTO]

    Grazie mille Andrea!

    Il mio approccio era votato solo ad ottenere il primo livello ed i propri figli.

    Fatta la query ho potuto popolare il mio TreeView fino al secondo livello.

    Siccome poi non so quanti livelli PARENT CHILD avrò sotto, ho preferito questo approccio (di default carico i primi due) e gli altri li espando in base agli input dell'utente: quindi se clicca su ROSSI2 ad esempio lancio una query che chiede chi sono i sui figli ed aggiungo al volo al nodo selezionato i figli.
    Questo approccio mi consente un programma molto snello e veloce senza rinunce per gli utenti: dove clicchi sotto al secondo livello lui popola al volo.

    Grazie a tutti!
Devi accedere o registrarti per scrivere nel forum
6 risposte