Frage

Ich bin neu bei SQL Server Reporting Services und habe mich gefragt, wie ich Folgendes am besten tun kann:

  • Abfrage, um eine Liste beliebter IDs zu erhalten
  • Unterabfrage für jedes Element, um Eigenschaften aus einer anderen Tabelle abzurufen

Im Idealfall würden die Spalten des Abschlussberichts so aussehen:

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

Es gibt möglicherweise Möglichkeiten, eine riesige SQL-Abfrage zu erstellen, um dies alles auf einmal zu erledigen, aber ich würde es vorziehen, sie zu unterteilen.Ist der empfohlene Ansatz, eine VB-Funktion zu schreiben, um die Unterabfrage für jede Zeile auszuführen?Vielen Dank für jede Hilfe.

War es hilfreich?

Lösung

Ich würde die Verwendung von a empfehlen Unterbericht.Sie würden den Unterbericht in einer Tabellenzelle platzieren.

Andere Tipps

Je nachdem, wie die Ausgabe aussehen soll, könnte ein Unterbericht ausreichen, oder Sie könnten nach ID, Eigenschaft1, Eigenschaft2 gruppieren und die Elemente aus Ihrer anderen Tabelle als Detailelemente anzeigen (vorausgesetzt, Sie möchten mehr als nur die Anzahl anzeigen).

Etwas wie

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 Ich denke, Sie werden feststellen, dass ein äußerer Join eine bessere Leistung erbringt als die korrelierte Unterabfrage in dem von Ihnen angegebenen Beispiel.Denken Sie daran, dass die Unterabfrage für jede Zeile ausgeführt werden muss.

Die einfachste Methode ist diese:

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

Hier ist eine praktikable Version (unter Verwendung von Tabellenvariablen):

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

Offensichtlich ist dies nur ein grobes Beispiel – es gelten Standardregeln wie „Kein * auswählen“ usw.


UPDATE vom 21. August 2008 um 21:27 Uhr:
@AlexCuse – Ja, ich stimme der Leistung voll und ganz zu.

Ich fing an, es mit dem Outer-Join zu schreiben, sah dann aber in seiner Beispielausgabe die Anzahl und dachte, das sei das, was er wollte, und die Anzahl würde nicht korrekt zurückgegeben, wenn die Tabellen Outer-Join wären.Ganz zu schweigen davon, dass Verknüpfungen dazu führen können, dass Ihre Datensätze multipliziert werden (1 Eintrag aus Tabelle 1, der mit 2 Einträgen in Tabelle 2 übereinstimmt, = 2 Ergebnisse), was unbeabsichtigt sein kann.

Ich schätze, es kommt im Grunde auf die Einzelheiten an, was Ihre Abfrage zurückgeben muss.


UPDATE vom 21. August 2008 um 22:07 Uhr:
Um die anderen Teile Ihrer Frage zu beantworten: Ist eine VB-Funktion der richtige Weg?NEIN.Absolut nicht.Nicht für etwas so Einfaches.

Funktionen haben eine sehr schlechte Leistung, jede Zeile im Rückgabesatz führt die Funktion aus.

Wenn Sie die verschiedenen Teile der Abfrage „unterteilen“ möchten, müssen Sie sie eher wie eine gespeicherte Prozedur angehen.Erstellen Sie eine temporäre Tabelle, führen Sie einen Teil der Abfrage durch und fügen Sie die Ergebnisse in die Tabelle ein. Führen Sie dann alle weiteren erforderlichen Abfragen durch und aktualisieren Sie die ursprüngliche temporäre Tabelle (oder fügen Sie sie in weitere temporäre Tabellen ein).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top