Der Schlüssel dieser Frage ist "Optimal", was die schnellste Rückkehrzeit bedeutet. Ich habe ein paar Tabellen mit Informationen, von denen ich Stücke haben möchte. Ich habe keine Probleme, die Abfrage selbst zu schreiben, nur um herauszufinden, wie der schnellste Weg, um die Informationen zu bekommen wäre.So erhalten Sie Datensätze aus mehreren Tabellen optimal
- Audit (Dies ist die primäre Tabelle I von Informationen wollen)
- Order (Der Rest sind Tabellen I von begrenzten Daten wollen)
- Jobs
- Credits
Die Sache, die sie Gemeinsam ist ein Konto und somit eine AccountID. Ich habe die AccountID, nach der ich im Voraus suche. Leider hat die Audit-Tabelle keinen direkten Fremdschlüssel in der betreffenden Account-Tabelle, und um zu bestimmen, ob der Audit-Datensatz zu meiner Ergebnismenge gehört, müsste ich der Audit-Tabelle und den nachfolgenden 3 Tabellen nacheinander beitreten Überprüfen Sie, ob der Audit-Datensatz sich auf meine AccountID bezieht.
Zum Beispiel
Select a.* from [Audits] a JOIN [Orders] o ON a.RecordID = o.OrderID
where a.RecordType = 'Order' and o.AccountID = @AccountID
union
select a.* from [Audits] a JOIN [Jobs] j on a.RecordID = j.JobID
where a.RecordType = 'Job' and j.AccountID = @AccountID
...
Ich beabsichtige, ein nächste auf der ersten Teilmenge von Daten zu tun holen und dann in den Informationen aus den sekundären Tabellen zu füllen, so dass ich zunächst einen begrenzten Erfolg zu tun. Ich sehe das als ein zweiteiliges Problem, zuerst der schnellste Weg, die AuditIDs zu finden, die zu meiner Teilmenge gehören, und zweitens den schnellsten Weg, um die fehlenden Daten auszufüllen. Irgendwelche Vorschläge würden geschätzt werden.
EDIT 1
Ich habe jetzt mit einer Lösung zu kommen, aber ich würde daran interessiert zu wissen, ob es irgendwelche einfache Möglichkeiten, es zu optimieren, sind so hier in Ich werde es posten hofft, es hilft weiter das Problem zu klären. Wenn Sie Syntaxfehler bemerken, ignorieren Sie sie bitte einfach. Ich versuche so viele unnötige Informationen wie möglich zu entfernen.
Create Table #AuditTemp (columns)
Insert into #AuditTemp a.*, null as [Extra1], null as [Extra2] ...
From [Audits] a
Left Join [Orders] o ON a.RecordID = o.OrderID
Left Join [Jobs] j ON a.RecordID = j.JobID
Left Join [Credits] c ON a.RecordID = c.CreditID
Where o.AccountID = @AccountID or j.AccountID = @AccountID ...
Order By Time desc
OFFSET @offset ROWS FETCH NEXT @PageSize ROWS ONLY
Update #AuditTemp Set [Extra1] = o.[Column1] ...
From [Orders] Where o.AccountID = @AccountID and #AuditTemp.RecordID = o.OrderID
...
So bekomme ich die 20 Datensätze, die ich brauche, und sie dann zu einem Zeitpunkt in einem füllen, wenn sie zusammenpassen.
Lassen Sie mich sehen, wenn ich es richtig mache: das 'RecordID' Feld aus der' Audit' Tabelle kann entweder eine Bestellung, ein Job oder eine Gutschrift sein, und das einzige, was sie gemeinsam haben, ist das 'AccountID' Feld? –
Das sieht ... Spaß aus. Die eine Sache, die mir in den Sinn kommt, ist die Verwendung von "union all" anstelle von "union". Das wird die zusätzliche Sortierung und Deduplizierung von "union" auslassen. – SqlZim
Welche Version & Edition von SQL Server verwenden Sie? 'select @@ version' – SqlZim