内部连接外部表中具有ID的多个ID列,以显示多个名称列

时间:2017-10-17 08:55:01

标签: sql sql-server database select join

我需要进行一个查询,内部从一个表中连接3个不同的id,其中id来自另一个表,然后在我的select查询中显示该表中的名称值。我会试着让它更清楚一点。

在我的一个表格中,我有这3个列为id' s:

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

这些都需要与另一个表中的列内部连接,该表包含与这些ID关联的名称:

Book_Sommerhuse.[BS_ID]

在我的SELECT查询中,我包含了外表中的name列。我希望有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]

但是这会从我的select查询中返回并返回空视图。我还不确定如何为与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#;

3 个答案:

答案 0 :(得分:2)

你需要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

答案 1 :(得分: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

答案 2 :(得分:0)

使用可以使用派生表,它可以为您提供三列数据作为单个列,然后您可以应用连接,类似这样

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]