2010-06-14 2 views
0

Je suis un concepteur graphique essayant de mon mieux de comprendre les alias de table, mais cela ne fonctionne pas. Voici ce que j'ai jusqu'à présent:Essayer d'utiliser des alias de table dans SQL

SELECT colours.colourid     AS colourid1, 
     combinations.manufacturercolourid AS colourmanid1, 
     colours.colourname    AS colourname1, 
     colours.colourhex     AS colourhex1, 
     combinations.qecolourid2   AS colouridqe2, 
     colours.colourid     AS colourid2, 
     colours.colourname    AS colourname2, 
     colours.colourhex     AS colourhex2, 
     colours.colourid     AS colourid3, 
     combinations.qecolourid3   AS colouridqe3, 
     colours.colourname    AS colourname3, 
     colours.colourhex     AS colourhex3, 
     colours.colourid     AS colourid4, 
     combinations.qecolourid4   AS colouridqe4, 
     colours.colourname    AS colourname4, 
     colours.colourhex     AS colourhex4, 
     combinations.coloursupplierid 
FROM combinations 
     INNER JOIN colours 
     ON colours.colourid = combinations.manufacturercolourid; 

Maintenant, l'idée est que dans les couleurs table de recherche, l'identifiant va tirer le code couleur, hex et le nom de la table de consultation afin que je puisse tirer le code couleur , hex et nom pour les 4 couleurs que je cherche. Je peux faire fonctionner ça, mais ça ne fait que remonter le prénom, le code et l'hexagone et je ne vois pas ce que je fais de mal.

+0

Mettez le code, et briser les lignes, ce qui est extrêmement difficile à lire –

+0

Vous pouvez mettre à jour la question avec un échantillon 'SELECT *' des tables 'colours' et' combinations', et vous voudrez peut-être aussi pour fournir la sortie attendue. –

Répondre

3

Votre problème est que vous liez dans un seul enregistrement de la table de couleurs parce que vous n'avez qu'un seul JOIN dans votre SQL. Cet enregistrement correspond à la couleur spécifiée par manufacturer_colour_id.

Vous pouvez également avoir un problème supplémentaire en ce sens que votre tableau de combinaisons ne semble pas être dans la forme normale normale (bien que je puisse me tromper, ne sachant pas la nature réelle des données que vous essayez de représenter).

Si je comprends votre problème correctement, la solution (en utilisant vos structures de table en cours) sera quelque chose comme:

SELECT C1.colourid    AS colourid1, 
    CMB.manufacturercolourid  AS colourmanid1, 
    C1.colourname    AS colourname1, 
    C1.colourhex     AS colourhex1, 
    CMB.qecolourid2    AS colouridqe2, 
    C2.colourid     AS colourid2, 
    C2.colourname    AS colourname2, 
    C2.colourhex     AS colourhex2, 
    C3.colourid     AS colourid3, 
    CMB.qecolourid3    AS colouridqe3, 
    C3.colourname    AS colourname3, 
    C3.colourhex     AS colourhex3, 
    C4.colourid     AS colourid4, 
    CMB.qecolourid4    AS colouridqe4, 
    C4.colourname    AS colourname4, 
    C4.colourhex     AS colourhex4, 
    CMB.coloursupplierid 
FROM combinations CMB 
    LEFT OUTER JOIN colours C1 
    ON C1.colourid = CMB.manufacturercolourid 
    LEFT OUTER JOIN colours C2 
    ON C2.colourid = CMB.qecolourid2 
    LEFT OUTER JOIN colours C3 
    ON C3.colourid = CMB.qecolourid3 
    LEFT OUTER JOIN colours C4 
    ON C4.colourid = CMB.qecolourid4 

Ce qui se passe ici est que je relie quatre fois la table des couleurs, une fois pour chacun des champs color_id dans la table des combinaisons. Pour ce faire, je dois aliaser le nom de la table à chaque fois afin que je sache laquelle des quatre instances de couleurs possibles utiliser dans la liste des colonnes retournées. En outre, j'utilise OUTER JOINs dans le cas où une ou plusieurs colonnes color_id pourraient être vides. Si cela se produisait avec INNER JOINs, la ligne entière serait supprimée du jeu de résultats.

+0

Merci, je me suis retrouvé avec quelque chose de très similaire, mais à tout le moins je comprends ce que je fais maintenant. – stephmoreland

3

Vous pouvez utiliser des alias de table pour réduire la quantité de frappe nécessaire - en ajoutant quelque chose comme ceci:

SELECT 
    cl.colourid     AS colourid1, 
    cb.manufacturercolourid AS colourmanid1, 
    cl.colourname    AS colourname1, 
    ... and so on..... 
FROM 
    combinations AS cb 
INNER JOIN 
    colours AS cl ON cl.colourid = cb.manufacturercolourid; 

En définissant un alias de table cb pour votre table combinations, vous pouvez utiliser cet alias plus court dans votre SELECT et d'autres parties de votre déclaration, au lieu de toujours épeler le nom de la table entière.

Mais votre problème est vraiment JOIN - vous ne joindrez une fois, mais vous attendez à obtenir quatre résultats retour ....

Ce que vous devez faire est quelque chose comme ceci:

SELECT 
    col1.colourid   AS colourid1, 
    cb.manufacturercolourid AS colourmanid1, 
    col1.colourname   AS colourname1, 
    col1.colourhex   AS colourhex1, 

    cb.qecolourid2   AS colouridqe2, 
    col2.colourid   AS colourid2, 
    col2.colourname   AS colourname2, 
    col2.colourhex   AS colourhex2, 
    col2.colourid   AS colourid3, 

    cb.qecolourid3   AS colouridqe3, 
    col3.colourname   AS colourname3, 
    col3.colourhex   AS colourhex3, 
    col3.colourid   AS colourid4, 

    cb.qecolourid4   AS colouridqe4, 
    col4.colourname   AS colourname4, 
    col4.colourhex   AS colourhex4, 
    cb.coloursupplierid 
FROM 
    combinations cb 
INNER JOIN colours AS col1 ON col1.colourid = cb.manufacturercolourid 
INNER JOIN colours AS col2 ON col2.colourid = cb.qecolourid2 
INNER JOIN colours AS col3 ON col3.colourid = cb.qecolourid3 
INNER JOIN colours AS col4 ON col4.colourid = cb.qecolourid4 
2

Ceci n'est pas une réponse exhaustive, mais votre problème est lié à la façon dont vous utilisez les JOINs. Les alias de table et de colonne n'affectent pas le jeu de résultats de sortie.

Vous sélectionnez les mêmes noms de champs quatre fois, et c'est pourquoi vous obtenez des résultats étranges.

+2

Oui. Comme suggéré dans les commentaires de «question», listez les descriptions des colonnes dans les deux tables, une rangée ou trois de données d'exemple de chacun, et un exemple des lignes/colonnes que vous voudriez renvoyer. –

0

Ce sont tous très bien, mais pour une raison quelconque lorsque je tente de les utiliser, je reçois une erreur dans la page:

[Microsoft] [Pilote ODBC Microsoft Access] Erreur de syntaxe (opérateur manquant) dans l'expression de requête

Je pense que je comprends comment utiliser les alias de table maintenant, mais pour une raison quelconque, même si je suis sûr que cela devrait fonctionner, la page ne l'aime pas.

Questions connexes