在外部表中添加具有ID的多个ID列以显示多个名称列

问题描述:

我需要进行一个查询,即内部连接来自一个表的另一个ID与来自另一个表的ID不同,然后显示该表中的名称值选择查询。我会尽量使它更清楚。在外部表中添加具有ID的多个ID列以显示多个名称列

在我的一个表我有这3列用的ID:

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

这些都需要作为内部与另一个表中的列,其中包含与这些ID相关联的名称加入:

Book_Sommerhuse.[BS_ID] 

在我的SELECT查询中,我包含了来自外部表的名称列。我想改为有3列,每列都有与ID对应的关联名称。

Book_Sommerhuse.BS_Navn 

到目前为止,我已经试图使多个内部连接使用AND关键字:

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

但这种回报,从我的选择查询空视图。我也不确定如何为与ID关联的每个名称创建新列。

全面查询:

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

Book_Kalender表上的Id是否都指向相同的名称或不同的名称? –

+0

我认为你的Book_Kalendar表需要规范化 - 每当你发现自己在同一个表中的多个列中存储相同的东西时,是时候为包含这些标识的子表添加外键,并返回父表。 – ADyson

+0

它们是不同的ID,因此它们在Book_Sommerhuse表中引用不同的名称。 – Leth

需要3左连接:

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

谢谢,我正在努力实现你的代码,但是我得到了关于Book_Kalender的“Missing operator error”。[BS_ID] = B [BS_ID_Prio2] – Leth

+0

检查你的列名,你可以删除括号 – Indent

+0

我还在同样的错误。我已将我的完整查询添加到原始帖子中。我删除了列名中的括号。 – Leth

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

我正在使用MS Access运行此查询,因此语法稍有不同。对不起,我的帖子中没有说清楚。据我所知,我需要将第一个连接子句用括号括起来,从逻辑上将它与其他连接分开,但它仍然会抛出“缺少操作符”的错误。 – Leth

使用可以使用派生表可能为您提供三个数据作为一列,然后你可以申请加入,像这样的

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]