J'ai une requête qui utilise trois tables de recherche pour obtenir toutes les informations dont j'ai besoin. J'ai besoin d'avoir des DISTINCT
valeurs pour une colonne, mais j'ai également besoin du reste des données qui lui sont associées.
Mon code SQL:
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;
Je veux obtenir tous les produits de cette requête, mais je ne veux les obtenir qu'une seule fois car je remplis un menu déroulant pour une application de recherche. Je veux que l'utilisateur puisse choisir parmi les produits qui se trouvent dans ce tableau (c'est pourquoi je n'en ai besoin qu'une seule fois).
Est-ce trop compliqué? Dois-je utiliser une approche plus simplifiée?
sql-server-2005
stephmoreland
la source
la source
Réponses:
Une autre approche non encore mentionnée consiste à utiliser des fonctions de fenêtre, par exemple row_number:
la source
Il y a plusieurs façons de procéder. Les deux principales que j'utilise sont des expressions de table et des sous-requêtes courantes. En utilisant un CTE, votre requête ressemblerait à ceci:
Ou en utilisant une sous-requête:
Je teste normalement pour voir lequel est le plus rapide et je choisis celui-là.
J'espère que ceci vous aide.
la source
(Je pense que ce que vous essayez de faire est de "réduire" chaque ligne de résultat en un seul produit, donc cette réponse part de cette hypothèse.)
Ce n'est pas possible. Pour obtenir les données 1 .. * associées des autres tables, vous devez renvoyer des valeurs en double dans les autres colonnes.
Généralement, la façon de gérer cela consiste à exécuter la requête telle quelle et à traiter l'ensemble de résultats joint dans le code d'application. Je le fais généralement en utilisant une approche de collecte de hachage qui se termine par des entités distinctes de chaque type dans une collection basée sur une valeur clé.
Bien que cette approche coûte plus cher en termes de trafic réseau, il est généralement préférable de faire quelque chose comme exécuter plusieurs requêtes et assembler les résultats comme vous en avez besoin dans le code d'application. Cela dépend de nombreux facteurs, y compris la fréquence d'exécution de la ou des requêtes et la quantité de données renvoyées.
la source