Domanda

Sono nuovo in SQL Server Reporting Services e mi chiedevo il modo migliore per eseguire le seguenti operazioni:

  • Effettua una query per ottenere un elenco di ID popolari
  • Eseguire una sottoquery su ciascun elemento per ottenere proprietà da un'altra tabella

Idealmente, le colonne del rapporto finale sarebbero simili a queste:

[ID] [property1] [property2] [SELECT COUNT(*)
                              FROM AnotherTable 
                              WHERE ForeignID=ID]

Potrebbero esserci modi per costruire una query SQL gigante per fare tutto in una volta, ma preferirei suddividerla in compartimenti.L'approccio consigliato è scrivere una funzione VB per eseguire la sottoquery per ogni riga?Grazie per qualsiasi aiuto.

È stato utile?

Soluzione

Consiglierei di utilizzare a Sottoreport.Dovresti inserire il sottoreport in una cella di tabella.

Altri suggerimenti

A seconda di come desideri che appaia l'output, potrebbe essere adatto un sottoreport oppure potresti raggruppare su ID, proprietà1, proprietà2 e mostrare gli elementi dell'altra tabella come elementi di dettaglio (supponendo che tu voglia mostrare più del semplice conteggio).

Qualcosa di simile a

select t1.ID, t1.property1, t1.property2, t2.somecol, t2.someothercol
from table t1 left join anothertable t2 on t1.ID = t2.ID

@Carlton Jenke Penso che troverai un join esterno con prestazioni migliori rispetto alla sottoquery correlata nell'esempio che hai fornito.Ricordare che la sottoquery deve essere eseguita per ogni riga.

Il metodo più semplice è questo:

select *,
 (select count(*) from tbl2 t2 where t2.tbl1ID = t1.tbl1ID) as cnt
from tbl1 t1

ecco una versione praticabile (utilizzando le variabili di tabella):

declare @tbl1 table
(
 tbl1ID int,
 prop1 varchar(1),
 prop2 varchar(2)
)

declare @tbl2 table
(
 tbl2ID int,
 tbl1ID int
)

select *,
 (select count(*) from @tbl2 t2 where t2.tbl1ID = t1.tbl1ID) as cnt
from @tbl1 t1

Ovviamente questo è solo un esempio grezzo: si applicano le regole standard come non selezionare *, ecc...


AGGIORNAMENTO dal 21 agosto 2008 alle 21:27:
@AlexCuse - Sì, totalmente d'accordo sulla performance.

Ho iniziato a scriverlo con l'outer join, ma poi ho visto il conteggio nel suo output di esempio e ho pensato che fosse quello che voleva, e il conteggio non sarebbe tornato correttamente se le tabelle fossero state unite esternamente.Per non parlare del fatto che i join possono causare la moltiplicazione dei record (1 voce da tbl1 che corrisponde a 2 voci in tbl2 = 2 rendimenti) che può essere involontaria.

Quindi immagino che si riduca davvero alle specifiche su ciò che la tua query deve restituire.


AGGIORNAMENTO dal 21 agosto 2008 alle 22:07:
Per rispondere alle altre parti della tua domanda: una funzione VB è la strada da percorrere?NO.Assolutamente no.Non per qualcosa di così semplice.

Le funzioni hanno prestazioni pessime, ogni riga nel set restituito esegue la funzione.

Se vuoi "compartimentalizzare" le diverse parti della query devi affrontarla più come una procedura memorizzata.Crea una tabella temporanea, esegui parte della query e inserisci i risultati nella tabella, quindi esegui eventuali ulteriori query necessarie e aggiorna la tabella temporanea originale (o inseriscila in più tabelle temporanee).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top