如何加入没有公共列的第四个表

Posted

技术标签:

【中文标题】如何加入没有公共列的第四个表【英文标题】:How to join a 4th table which doesn't have common column 【发布时间】:2017-11-30 17:18:29 【问题描述】:

我有 4 个表,detail_table、a​​dders_table、form_table 和 summary_table 前 3 个表有一个公共列piece_ID,但第 4 个表 summary_table 没有 Piece_ID 列,而是具有 ID 列,该列仅存在于详细表中,而不存在于地址和表单表中 现在有什么办法可以将所有这 4 个表连接在一起吗?

(我已经成功加入表格、地址和明细表,只剩下摘要) 以下是包含 3 个表的查询,我从中得到了成功的结果。

    Select archive_address.PieceID, archive_adf_detail.Job_ID, prod_code, 
seq_number,process_date, seq_queue, addline1, addline2,addline3,addline4,addline5, archive_freeform.free_form1, archive_Free_Form2
from archive_Address join archive_adf_detail
on archive_address.PieceID = archive_adf_detail.F_key
join archive_freeform
on archive_address.PieceID = archive_freeform.PieceID
Where (archive_Address.addline1 like '%Cons%' 
or archive_Address.addline2 like '%Cons%' )
and archive_Address.pieceID like '%FB2K%'
order by addline1

我正在使用下面的查询来添加第 4 个表

Select archive_address.PieceID, archive_adf_detail.Job_ID, prod_code, job_summary.Status_Date,
seq_number,process_date, seq_queue, addline1, addline2,addline3,addline4,addline5, archive_freeform.free_form1, archive_freeform.Free_Form2
from archive_Address join archive_adf_detail
on archive_address.PieceID = archive_adf_detail.F_key
join archive_freeform
on archive_address.PieceID = archive_freeform.PieceID
join job_summary 
on archive_adf_detail.job_ID = job_summary.job_ID
Where (archive_Address.addline1 like '%Cons%' 
or archive_Address.addline2 like '%Cons%' )
and archive_Address.pieceID like '%FB2K%'
order by addline1

执行上述操作后,我收到以下错误:

Msg 207, Level 16, State 1, Line 8
Invalid column name 'jobID'.
Msg 209, Level 16, State 1, Line 1
Ambiguous column name 'prod_code'.
Msg 209, Level 16, State 1, Line 2
Ambiguous column name 'seq_number'.
Msg 209, Level 16, State 1, Line 2
Ambiguous column name 'process_date'.
Msg 207, Level 16, State 1, Line 2
Invalid column name 'archive_Free_Form2'.

如果我使用了不正确的语法或无法像这样加入第四张桌子,请纠正我 谢谢!

【问题讨论】:

是的。 . .使用公共列连接表。 但是汇总表没有一个公共列,它存在于其余 3 中,而是它有一个列仅存在于明细表中而不存在于其他 2 中,我在加入第 4 个表时遇到错误(汇总表) 请通过添加错误消息来编辑您的问题。还要指定您的数据库引擎。 正如 Gordon 所说,您应该能够在 ID 上加入 detail_table 和 summary_table 感谢您的回复我已经用我正在使用的查询更新了我的问题,如果我没有使用正确的方法,请纠正我。 【参考方案1】:

根据查询所表达的关系连接表。你的连接很好。

该错误与列的名称在表集合中不是唯一的事实有关(不明确:具有多种含义)。您需要用列名指定哪个表。

Select 
    archive_address.PieceID, 
    archive_Address.addline1,
    archive_Address.addline2,
    archive_Address.addline3,
    archive_Address.addline4,
    archive_Address.addline5,
    archive_adf_detail.prod_code,
    archive_adf_detail.seq_number,
    archive_adf_detail.process_date,
    archive_adf_detail.seq_queue,
    archive_freeform.Job_ID,
    archive_freeform.free_form1,
    archive_freeform.Free_Form2,
    job_summary.Status_Date
From archive_Address 
Join archive_adf_detail on archive_address.PieceID = archive_adf_detail.F_key
Join archive_freeform on archive_address.PieceID = archive_freeform.PieceID
Join job_summary on archive_freeform.job_ID = job_summary.job_ID
Where (archive_Address.addline1 like '%Cons%' or archive_Address.addline2 like '%Cons%' )
and archive_Address.pieceID like '%FB2K%'
Order by archive_Address.addline1

我不完全确定您是否传达了架构,因为您问题中的错误消息与第二个查询不对应。 需要了解哪些数据在哪里,以及您想要哪些部分。

【讨论】:

除了我的第一个查询之外,我还添加了一列 status_date 并添加了第四个表 job_summary join job_summary on archive_adf_detail.job_ID = job_summary.jobID 哪些列属于哪些表?除非你告诉我,否则我不知道你的架构。 sorry my bad 1st is the table name and then column names Archive_address (PieceID Addline1 Addline2 Addline3 Addline4 Addline5), archive_adf_detail (PieceID prod_code seq_number process_date seq_queue), archive_freeform (PieceID Job_ID free_form1 Free_Form2), job_summary (job_id Satus_date) 您需要返回表定义。例如。 archive_adf_detailF_key 列,还是 PieceID?根据偏好,将其编辑到问题中,而不是对答案的评论 SSMS 上下文菜单“Script Table as...”->“Create”将给出一个表的定义。复制所有四个表的内容

以上是关于如何加入没有公共列的第四个表的主要内容,如果未能解决你的问题,请参考以下文章

具有三个公共值的行中的空值,第四个随着一个匹配而变化

如何在第三个表中没有公共列的情况下连接三个表?

静态工厂的第四个优点是返回对象的类可以根据输入参数的不同而不同。

在没有公共列的情况下连接两个数据框

加入具有另一个表的两个公共列的 postgres 表

如何将 SQL 中的 2 个表与 1 个公共列组合在一起,而其他列中没有关系?