Ich habe eine Abfrage, die drei Nachschlagetabellen verwendet, um alle benötigten Informationen abzurufen. Ich brauche DISTINCT
Werte für eine Spalte, aber ich brauche auch den Rest der damit verbundenen Daten.
Mein SQL Code:
SELECT acss_lookup.ID AS acss_lookupID,
acss_lookup.product_lookupID AS acssproduct_lookupID,
acss_lookup.region_lookupID AS acssregion_lookupID,
acss_lookup.document_lookupID AS acssdocument_lookupID,
product.ID AS product_ID,
product.parent_productID AS productparent_product_ID,
product.label AS product_label,
product.displayheading AS product_displayheading,
product.displayorder AS product_displayorder,
product.display AS product_display,
product.ignorenewupdate AS product_ignorenewupdate,
product.directlink AS product_directlink,
product.directlinkURL AS product_directlinkURL,
product.shortdescription AS product_shortdescription,
product.logo AS product_logo,
product.thumbnail AS product_thumbnail,
product.content AS product_content,
product.pdf AS product_pdf,
product.language_lookupID AS product_language_lookupID,
document.ID AS document_ID,
document.shortdescription AS document_shortdescription,
document.language_lookupID AS document_language_lookupID,
document.document_note AS document_document_note,
document.displayheading AS document_displayheading
FROM acss_lookup
INNER JOIN product ON (acss_lookup.product_lookupID = product.ID)
INNER JOIN document ON (acss_lookup.document_lookupID = document.ID)
ORDER BY product_displayheading ASC;
Ich möchte alle Produkte aus dieser Abfrage abrufen, möchte sie jedoch nur einmal abrufen, da ich ein Dropdown-Menü für eine Suchanwendung ausfülle. Ich möchte, dass der Benutzer aus den in dieser Tabelle aufgeführten Produkten auswählen kann (daher benötige ich sie nur einmal).
Ist das zu kompliziert? Sollte ich einen vereinfachten Ansatz verwenden?
sql-server-2005
stephmoreland
quelle
quelle
Antworten:
Ein weiterer Ansatz, der noch nicht erwähnt wurde, ist die Verwendung von Fensterfunktionen, zum Beispiel row_number:
quelle
Hierfür gibt es verschiedene Möglichkeiten. Die beiden wichtigsten, die ich verwende, sind allgemeine Tabellenausdrücke und Unterabfragen. Unter Verwendung eines CTE würde Ihre Anfrage ungefähr so aussehen:
Oder mit einer Unterabfrage:
Normalerweise teste ich, was schneller ist und gehe damit um.
Ich hoffe das hilft dir.
quelle
(Ich denke, Sie versuchen, jede Ergebniszeile auf ein einzelnes Produkt zu reduzieren. Diese Antwort geht also von dieser Annahme aus.)
Das ist nicht möglich. Um die zugehörigen 1 .. * -Daten aus den anderen Tabellen abzurufen, müssen Sie doppelte Werte in den anderen Spalten zurückgeben.
Im Allgemeinen können Sie die Abfrage so ausführen, wie sie ist, und die verknüpfte Ergebnismenge im Anwendungscode verarbeiten. Normalerweise verwende ich dazu einen Hash-Erfassungsansatz, bei dem unterschiedliche Entitäten jedes Typs in einer Sammlung basierend auf einem Schlüsselwert gefunden werden.
Dieser Ansatz kostet zwar mehr Netzwerkverkehr, ist jedoch in der Regel besser geeignet, mehrere Abfragen auszuführen und die Ergebnisse nach Bedarf im Anwendungscode zusammenzufügen. Dies hängt von vielen Faktoren ab, einschließlich der Häufigkeit der Ausführung der Abfragen und der Anzahl der zurückgegebenen Daten.
quelle