2017-10-17 14 views
0

Je dois faire une requête que interne joint 3 ID différents d'une table avec l'ID d'un autre, puis afficher la valeur de nom de cette table dans mon sélectionnez une requête. Je vais essayer de le rendre un peu plus clair.Inner rejoindre plusieurs colonnes ID avec ID dans la table étrangère pour afficher plusieurs colonnes de nom

Dans mon une table, j'ai ces 3 colonnes avec id:

Book_Kalender.BS_ID, 
Book_Kalender.BS_ID_Prio2, 
Book_Kalender.BS_ID_Prio3, 

Ces doivent tous être intérieur joint à une colonne dans une autre table, qui contient le nom associé à ces ids:

Book_Sommerhuse.[BS_ID] 

Dans ma requête SELECT j'inclue la colonne de nom de la table étrangère. Je veux à la place avoir 3 colonnes, chacune avec le nom associé qui correspond à l'ID.

Book_Sommerhuse.BS_Navn 

Jusqu'à présent, j'ai essayé de faire plusieurs jointures internes en utilisant le mot-clé ET:

INNER JOIN Book_Kalender ON Book_Sommerhuse.[BS_ID] = Book_Kalender.[BS_ID] 
AND Book_Sommerhuse.[BS_ID] = Book_Kalender.[BS_ID_Prio2] 

Mais ce retour et vue vide de ma requête de sélection. Je ne sais pas non plus comment créer de nouvelles colonnes pour chaque nom associé à l'ID.

requête complète:

SELECT 
    Book_Kalender.BK_ID, 
    Book_Kalender.BK_DatoFra, 
    Book_Kalender.BK_DatoTil, 
    Book_Kalender.BK_M_Navn, 
    Book_Kalender.BK_M_Adr, 
    Book_Kalender.BK_M_PostBy, 
    Book_Kalender.BK_M_Afd, 
    Book_Kalender.BK_M_MedArbNr, 
    Book_Kalender.BK_M_Tlf, 
    Book_Kalender.BK_M_Email, 
    Book_Kalender.BK_Tidl_Lejet, 
    Book_Kalender.BK_Tidl_Lejet_Txt, 
    Book_Kalender.BS_ID, 
    Book_Kalender.BS_ID_Prio2, 
    Book_Kalender.BS_ID_Prio3,  
    A.BS_Navn as BS_Navn1, 
    B.BS_Navn as BS_Navn2, 
    c.BS_Navn as BS_Navn3, 
    coalesce(A.BS_Navn,B.BS_Navn,c.BS_Navn) as BS_Navn  
FROM 
    Book_Kalender 
    LEFT JOIN Book_Sommerhuse A ON 
     Book_Kalender.BS_ID  = A.BS_ID 
    LEFT JOIN Book_Sommerhuse B ON 
     Book_Kalender.BS_ID_Prio2 = B.BS_ID 
    LEFT JOIN Book_Sommerhuse C ON 
     Book_Kalender.BS_ID_Prio3 = C.BS_ID  
WHERE 
    Book_Kalender.BK_DatoFra BETWEEN #10/15/2017# AND #12/31/2018#; 
+0

Est-ce que les ID de la table Book_Kalender se réfèrent tous au même nom ou à des noms différents? –

+0

Je pense que votre table Book_Kalendar a besoin de normalisation - chaque fois que vous stockez la même chose dans plusieurs colonnes dans la même table, il est temps pour une sous-table contenant ces ID, avec une clé étrangère de retour à la table parent. – ADyson

+0

Ce sont des identifiants différents, ils font donc référence à des noms différents dans la table Book_Sommerhuse. – Leth

Répondre

2

Vous avez besoin 3 gauche rejoindre:

select 
    Book_Kalender.*, 
    A.BS_Navn as BS_Navn1, 
    B.BS_Navn as BS_Navn2, 
    C.BS_Navn as BS_Navn3, 
    coalesce(A.BS_Navn,B.BS_Navn,c.BS_Navn) as BS_Navn -- first non null BS_Navn 
from  
    Book_Kalender 
    LEFT JOIN Book_Sommerhuse A ON 
     Book_Kalender.BS_ID  = A.BS_ID 
    LEFT JOIN Book_Sommerhuse B ON 
     Book_Kalender.BS_ID_Prio2 = B.BS_ID 
    LEFT JOIN Book_Sommerhuse C ON 
     Book_Kalender.BS_ID_Prio3 = C.BS_ID 
+0

Merci, j'essaie d'implémenter votre code, mais je reçois une "erreur d'opérateur manquant" par rapport à Book_Kalender. [BS_ID] = B. [BS_ID_Prio2] – Leth

+0

vérifier les noms de vos colonnes, vous pouvez supprimer la parenthèse – Indent

+0

Je reçois toujours la même erreur. J'ai ajouté ma requête complète à mon message d'origine. J'ai enlevé les crochets des noms de colonnes. – Leth

0
SELECT 
    K.BS_ID 
    ,S1.BS_Navn 
    ,K.BS_ID_Prio2 
    ,S2.BS_Navn 'Prio2_BS_Navn' 
    ,K.BS_ID_Prio3 
    ,S3.BS_Navn 'Prio3_BS_Navn' 
FROM 
    Book_Kalender K 
LEFT JOIN 
    Book_Sommerhuse S1 ON S1.BS_ID = K.BS_ID 
LEFT JOIN 
    Book_Sommerhuse S2 ON S2.BS_ID = K.BS_ID_Prio2 
LEFT JOIN 
    Book_Sommerhuse S3 ON S3.BS_ID = K.BS_ID_Prio3 
+0

Je cours cette requête using MS Access, ainsi la syntaxe est légèrement différente.Désolé de ne pas être clair dans mon message. Si je comprends bien, j'ai besoin de placer la première clause de jointure entre parenthèses pour la séparer logiquement des autres, mais elle renvoie une erreur "opérateur manquant". – Leth

0

utilisation pourrait utiliser la table dérivée qui pourrait vous fournir trois données de colonnes en une seule colonne et vous pourriez appliquer la jointure, quelque chose comme ça

INNER JOIN (
       SELECT BS_IDs FROM Book_Kalender CROSS APPLY(
       VALUES (BS_ID), (BS_ID_Prio2), (BS_ID_Prio3)) Cols(BS_IDs) 
      ) DerivedBook_Kalender ON Book_Sommerhuse.[BS_ID] = DerivedBook_Kalender.[BS_IDs]