Consiglio Query

martedì 20 ottobre 2009 - 19.17

maolimix Profilo | Newbie

Ciao a tutti,
ho un dubbio progettuale su sql server 2005...
In pratica, supponete di avere 2 tabelle (che chiamerò A e B). La tabella A ha 2 primary key (pa1 e pa2) e la tabella B ha 4 primary key (pb1,pb2,pb3,pb4). Le colonne pa1 e pa2 corrispondono , rispettivamente, alle colonne pb1 e pb2.
Premesso ciò io devo effettuare la seguente query (in un metodo in linguaggio C# usando, ahimè :),VS 2003):
select * from A a
inner join B a on a.pa1=b.pb1 and a.pa2=b.pb2

Questo significherà che avrò un tabellone in cui ad ogni univoco valore di A ne avrò "n" di B (perchè la query è fatta solo su una parte delle primary keys di B che sono 4 in tutto).
Insomma, avevo pensato di mettere il risultato della select in un dataset e poi "fetchare" riga per riga. Il problema è che i valori delle colonne di A saranno replicati tante volte quante colonne di B avrò in corrispondenza della condizione a.pa1=b.pb1 and a.pa2=b.pb2 quindi mi troverei a prelevare valori di A n volte...già presi la prima volta .
2 fetch innestate sono meno performanti di una join considerando l'elevato numero di colonne presenti nelle 2 tabelle ma..

la domanda è questa :

1)Vorrei trovare un modo per prendermi i valori delle colonne di A una volta sola nell'ambito di un i_esimo a.pa1=b.pb1 and a.pa2=b.pb2
2) trovare un modosemplice per capire quando i valori di A cambiano ossia si passa al vaglio dell' (i_esimo + 1) a.pa1=b.pb1 and a.pa2=b.pb2

Grazie a chiunque risponda

lbenaglia Profilo | Guru

>La tabella A ha 2 primary key (pa1 e pa2) e la tabella B ha 4
>primary key (pb1,pb2,pb3,pb4).

Ciao Maurizio,

Per definizione una tabella può avere al più una Primary Key.
Tale Primary Key può essere composta da una o più colonne.

>Le colonne pa1 e pa2 corrispondono
>, rispettivamente, alle colonne pb1 e pb2.
>Premesso ciò io devo effettuare la seguente query (in un metodo
>in linguaggio C# usando, ahimè :),VS 2003):
>select * from A a
>inner join B a on a.pa1=b.pb1 and a.pa2=b.pb2
>
>Questo significherà che avrò un tabellone in cui ad ogni univoco
>valore di A ne avrò "n" di B (perchè la query è fatta solo su
>una parte delle primary keys di B che sono 4 in tutto).
OK, hai una relationship 1-a-molti tra la tabella A e la tabella B.

>Insomma, avevo pensato di mettere il risultato della select in
>un dataset e poi "fetchare" riga per riga.
Motivo? Che devi fare con quel result set?

> Il problema è che
>i valori delle colonne di A saranno replicati tante volte quante
>colonne di B avrò in corrispondenza della condizione a.pa1=b.pb1
>and a.pa2=b.pb2 quindi mi troverei a prelevare valori di A n
>volte...già presi la prima volta .
Certo, hai eseguito una JOIN tra le due tabelle.

>2 fetch innestate sono meno performanti di una join considerando
>l'elevato numero di colonne presenti nelle 2 tabelle ma..
Concordo al 100%

>la domanda è questa :
>
>1)Vorrei trovare un modo per prendermi i valori delle colonne
>di A una volta sola nell'ambito di un i_esimo a.pa1=b.pb1 and
>a.pa2=b.pb2
>2) trovare un modosemplice per capire quando i valori di A cambiano
>ossia si passa al vaglio dell' (i_esimo + 1) a.pa1=b.pb1 and
>a.pa2=b.pb2
Se ci spieghi cosa devi fare con quel result set forse potremmo indicarti come procedere.

>Grazie a chiunque risponda
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

maolimix Profilo | Newbie

Ciao Lorenzo,
in effetti a come l'ho messa sembrava una rivelazione di cose ovvie più che la spiegazione di un problema ehehhehe. Cmq se ho dettagliatamente esposto anche cose banalmente deducibili era solo per far capire chiaramente il problema in un forum (solitamente è cosa ardua :) ).
Cmq tornando al problema il result set mi serve per riempire una serie di tabelle di "output" .
Cioè "altre procedure" prendono il result set (1:n per m volte ) fornito dai miei metodi in modo opportuno e provvedono a riempire alcune tabelle di output.

lbenaglia Profilo | Guru

>Cmq tornando al problema il result set mi serve per riempire
>una serie di tabelle di "output" .
>Cioè "altre procedure" prendono il result set (1:n per m volte
>) fornito dai miei metodi in modo opportuno e provvedono a riempire
>alcune tabelle di output.

Si, ma non capisco una cosa: se ti creano problemi le ridondanze nelle colonne dalla parte 1 della relationship, per quale motivo fai una join?
Non puoi interrogare separatamente le tabelle 1 e molti?

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

maolimix Profilo | Newbie

il problema è che io non so a priori quali sono quei campi per i quali( pa1=pb1 e pa2=pb2) per cui sono costretto a fare una query che me li caccia tutti e a quanto ne so il miglior modo per farlo è con la join. Solo che , di contro non so qual'è il miglior modo per gestire le ridondanze. Stavo pensando ad un dataset che contiene il "mondo" e poi filtrarlo su più datatable ad hoc che dici?

lbenaglia Profilo | Guru

>il problema è che io non so a priori quali sono quei campi per
>i quali( pa1=pb1 e pa2=pb2) per cui sono costretto a fare una
>query che me li caccia tutti e a quanto ne so il miglior modo
>per farlo è con la join.
Fanne 2:

- La prima specifica nella SELECT list solo le colonne della tabella dalla parte 1 della relationship utilizzando l'operatore EXISTS per valutare le righe corrispondenti sulla tabella dalla parte molti;

- la seconda specifica nella SELECT list solo le colonne della tabella dalla parte molti della relationship eseguendo la JOIN con quella dalla parte 1.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

maolimix Profilo | Newbie

Grande!!!! mi piace ..
Grazie
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5