2016-10-17 1 views
0

Ich habe eine Reihe von Abfragen UNION 'd zusammen. Jede Abfrage verfügt über eine WHERE... IN-Klausel, die mit derselben ID-Liste verglichen wird.Können Sie die Ergebnisse einer Unterabfrage zwischenspeichern, die wiederholt in einer gespeicherten Prozedur verwendet wird?

In vereinfachter Form zum Beispiel Zwecke sieht es wie folgt aus:

SELECT * FROM MyTable 
WHERE AuthorUserId IN (SELECT UserId FROM Users WHERE TeamId = @teamId) 

UNION 

SELECT * FROM MyTable 
WHERE PublisherUserId IN (SELECT UserId FROM USERS WHERE TeamId = @teamId) 

UNION... 

und so weiter. @teamId ist ein int gespeicherter Prozedurparameter.

Gibt es eine Möglichkeit SQL Server sagen zu der Ergebnismenge zu halten, von

SELECT UserId FROM USERS WHERE TeamId = @teamId 

, damit es nicht es SELECT für jede holen?

+1

Sie könnten in eine temporäre Tabelle einfügen und dann Abfrage dagegen ... oder Sie könnten hoffen, dass die Ergebnisse der Unterabfrage in den allgemeinen Abfragecache gelangt. –

Antwort

2

Eine Möglichkeit, dies durch die Erfassung der Ergebnisse dieser Abfrage tun könntest und es in einer temporären Tabelle zu speichern und JOIN ing zu diesen Ergebnissen in Ihrer Abfrage:

+0

Ich weiß, es sieht so aus, als könntest du die 'UNION's aus dem Beispiel entfernen, aber das ist nur, weil ich es so sehr vom Original vereinfacht habe. – Legion

+0

@Legion Ich dachte irgendwie - war nicht so sicher, also dachte ich, ich würde es für alle Fälle hineinwerfen. – Siyual

+1

Sie zeigen eine TABLE-Variable an, keine temporäre Tabelle. Es gibt einige Unterschiede, unter anderem, dass Abfragen für eine TABLE-Variable normalerweise langsamer sind. Siehe [Was ist der Unterschied zwischen einer temporären Tabelle und Tabellenvariablen in SQL Server?] (Https://dba.stackexchange.com/a/16386/65699) für eine erschöpfende Liste der Unterschiede. –

0

SQL Server ist intelligent genug, um Ergebnisse derselben Abfrage zu speichern, wenn die Parameter identisch sind. Wenn Ihre Unterabfrage keine Sitzungsvariablen verwendet, ist alles in Ordnung. Sie können auch den Index auf TeamId setzen, wodurch diese Abfrage schneller wird.

Wenn Sie sich immer noch Sorgen machen und eine Programmiersprache verwenden, um Daten von SP zu erhalten, sollten Sie sie in einer Variablen im Code speichern und diese Ergebnismenge dann in SP übergeben.

Zweite Option wäre es in temp-Tabelle zu speichern und dann abfragen aus temporärer Tabelle

Verwandte Themen