2010-12-15 73 views
0

J'ai besoin de construire une liste à partir de quelques tables et je n'arrive pas à trouver comment la construire.Construire des listes en sql

J'ai une table avec des modèles de vélo et une table de produits:

vélos

modelno, franchise, description, year,profile 
"1","kawasaki","ninja","2009","1-2009" 
"2","honda","cbr600","2006","2-2006" 

produits

productid, category, profile, 
"1","carburettor",",1-2009,", 
"2","Generic Gear Lever",",1-2009,2-2006," 

le champ de profil contient une liste délimitée par des virgules de tous les véhicules de la pièce.

je peux obtenir une liste de travailler pour un véhicule en utilisant:

SELECT 
    (SELECT Franchise + ' ' + 
      description + ' ' + 
      year as model from bikes where profile = @model + '-' + 
      @year 
    ) 
as model, catalogueref, tier2 
FROM products 
WHERE profile LIKE '%,' + @model + '-' + @year + ',%'` 

qui me donne:

bike, lever, sprocket, etc... 
kawasaki 250 2009, 123456,234567, etc... 

Cependant, je dois remplir cette fonction sur environ 8000 modèles, et vous plutôt ne pas avoir à faire chacun individuellement. Y a-t-il un moyen de faire en sorte qu'il prenne une liste de profils?

+0

Quel SGBD? En MySQL vous avez la fonction'group_concat() '. –

+0

J'utilise Microsoft SQL 2005 – DPERROTT

+0

* "champ de profil contient une liste délimitée par des virgules de tous les véhicules de la partie" * - Ceci est une décision de conception vraiment mauvaise. Si vous en avez l'occasion, changez-le avant de faire quoi que ce soit d'autre. – Tomalak

Répondre

0

Je voudrais voir si vous pouvez projeter une vue des données réelles dans chacune de vos colonnes pour les deux tables. Une fois que vous avez la vue, vous pouvez écrire une requête de jointure. Ce ne sera pas rapide, mais il va briser votre problème en morceaux gérables.

1

Vos exigences ne me sont pas entièrement claires car vous n'indiquez pas exactement ce que représentent les chiffres à la fin de l'enregistrement dans votre ensemble de résultats souhaité. Toutefois, si vous voulez exécuter l'exemple SELECT sur tous les produits de votre base de données, vous devriez pouvoir joindre les deux tables.

SELECT B.Franchise + ' ' + B.description + ' ' + B.year AS model, 
     P.catalogueref, P.tier2 
FROM bikes B INNER JOIN products P 
ON P.profile LIKE '%,' + B.modelno + '-' + B.year + ',%'` 

Si vous souhaitez filtrer cela pour certains profils, vous pouvez ajouter (par exemple)

WHERE B.Profile IN (. . .)