【问题标题】:Inner join multiple ID columns with ID in foreign table to display multiple name columns外部表中带有ID的多个ID列内部连接以显示多个名称列
【发布时间】:2017-10-17 08:55:01
【问题描述】:

我需要进行一个查询,将一个表中的 3 个不同 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#;

【问题讨论】:

  • Book_Kalender表上的Id都是同名还是异名?
  • 我认为您的 Book_Kalendar 表需要规范化 - 每当您发现自己在同一个表的多个列中存储相同的内容时,是时候使用包含这些 ID 的子表了,外键返回父表。
  • 它们是不同的 id,因此它们在 Book_Sommerhuse 表中引用了不同的名称。
  • @Leth 然后使用 LEFT JOIN,请参阅下面的答案
  • 谢谢,但遗憾的是无法规范化此表,因为它需要很快导入 SQL 数据库。我正在尝试创建一个与我要导入的表中的结构相匹配的选择语句。

标签: sql sql-server database select join


【解决方案1】:

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

【讨论】:

  • 谢谢,我正在尝试实现您的代码,但我收到与 Book_Kalender 相关的“缺少操作员错误”。[BS_ID] = B.[BS_ID_Prio2]
  • 检查你的列名,你可以去掉括号
  • 我仍然遇到同样的错误。我已将我的完整查询添加到我的原始帖子中。我从列名中删除了括号。
  • 如果可以,请从您的原始帖子中删除完整的查询。你发现错误了吗?
  • 我在这段查询中遇到了一个缺少操作符的错误:i.imgur.com/W4qcg8n.png
【解决方案2】:
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

【讨论】:

  • 我正在使用 MS Access 运行此查询,因此语法略有不同。很抱歉在我的帖子中没有说清楚。据我了解,我需要将第一个连接子句括在括号中,以便在逻辑上将其与其他子句分开,但它仍然会引发“缺少运算符”错误。
【解决方案3】:

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

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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 2018-03-20
    • 2022-01-10
    • 2021-08-20
    相关资源
    最近更新 更多