Frage

Im Verhältnis zu Effizienteste Möglichkeit, mehrere Aggregate in einem einzigen gespeicherten Proc zurückzugeben?

Ich habe eine E -Mail -Typ -Anwendung und möchte alle Nachrichten (Posteingang) für einen Benutzer auswählen. Das Problem ist, dass ich den Header -Teil der E -Mails in die DB normalisiere, so dass die flachen Daten in eine Nachrichtentabelle und die von, nach CC, BCC in eine andere Tabelle gelagert werden.

Was ist der beste Weg, um Nachrichten auszuwählen (vollständig - dh denmormalisieren die vollständige Nachricht), so dass jeder Datensatz alle relevanten Felder enthält, einschließlich aller Meldungstabellenfelder und alle zugehörigen Datensätze aus der Empfängertabelle, die sich auf die Nachricht gemäß PK/ bezieht FK -Beziehung.

Eine Sache, auf die ich viel Gewicht aufstelle

Für den Kontext ist hier eine Ansicht meines DB -Schemas.

DB SCHEMA

War es hilfreich?

Lösung

So würde ich es tun. Ich verwende regelmäßig Koales, um Zeilen in abgrenzte Felder zu legen, und es wird immer gut ausgeführt und skaliert (solange Sie erkennen, dass eine Unterabfrage immer einen Leistungs -Treffer verursacht).

Wenn Sie es nicht gerne als gespeicherte Prozedur ausführen können, können Sie auch leicht als Tabellenfunktion umschreiben.

Ein anderer Ansatz wäre ein CTE, nehme ich an, aber ich bin mit diesem Ansatz, von Grund auf neu zu tippen, nicht so vertraut.

CREATE PROCEDURE GetMessageById
    @pMessageID int
AS
BEGIN

SET NOCOUNT ON;

Declare @pTo varchar(max)
Declare @pCC varchar(max)
Declare @pBC varchar(max)

SELECT @pTo = COALESCE(@pTo + ', ', '') + [EmailAddress]
FROM MessageRecipient
WHERE MessageID = @pMessageID AND RecipientTypeID = 1 /** or whatever the id of TO field is */

SELECT @pCC = COALESCE(@pCC + ', ', '') + [EmailAddress]
FROM MessageRecipient
WHERE MessageID = @pMessageID AND RecipientTypeID = 2 /** or whatever the id of CC field is */

SELECT @pBC = COALESCE(@pBC + ', ', '') + [EmailAddress]
FROM MessageRecipient
WHERE MessageID = @pMessageID AND RecipientTypeID = 3 /** or whatever the id of BCC field is */

SELECT Message.*, @pTo as [ToField], @pCC as [CCField], @pBC as [BCCField], (SELECT TOP 1 [EmailAddress] FROM MessageRecipient Where RecipientTypeID = 0 /**<sender id>*/ AND MessageID = @pmessageID) AS [FromField] FROM Message Where Message.ID = @pMessageID

END
GO

Sie könnten sich fragen, wie sich Koalesce bei dieser Weise verwendet (ich habe es getan, als ich es zum ersten Mal verwendet habe). Grundsätzlich erzeugt es eine rekursive Abfrage, die jeden nachfolgenden Nicht-Null-Wert im Satz bis zum Ende des Rückgabersatzes zurückgibt. Wenn Sie das andere Ende herausholen, erhalten Sie eine Koma -Liste aller Ergebnisse als einzelne Zeichenfolge.

Andere Tipps

Ich würde eine Ansicht namens erstellen Viewinbox das wird von allen entwickelt eins zu eins Beziehungstabellen. Dies wäre meine Hauptansicht für Abfragen. Ich würde diese Ansicht (ViewinBox) verwenden, um eine Liste aller Posteingangselemente anzuzeigen.

Wenn der Benutzer Bohrungen nach unten In die Nachricht würde ich dann alle Informationen einschließlich der zurückbringen Eins-zu-Many Beziehungen von mehreren zu mehreren bis zu CCs und BCCs.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top