首页 > 解决方案 > 多表全外连接访问sql左连接

问题描述

我有两个包含面板数据的表(称为 tbl1 和 tbl3)和另一个用于将它们连接在一起的表(tbl2)。tbl1 有所有参与者的数据,但 tbl3 只有其中的一个子集。示例数据表是:

表1:

零件键 日期 活力
1 2021 年 1 月 1 日 567
1 2021 年 2 月 1 日 585
2 2021 年 1 月 1 日 1305
2 2021 年 2 月 1 日 1324
3 2021 年 1 月 1 日 860
3 2021 年 2 月 1 日 869

表2:

零件键 分配键
1 54
2 63
3 65

表3:

分配键 dt 损失因子
54 2021 年 1 月 1 日 .86
54 2021 年 2 月 1 日 .85
65 2021 年 1 月 1 日 .67
65 2021 年 2 月 1 日 .69

我想合并这些表,以便获得所有记录,而不仅仅是两个表共有的记录。我还在代码中将空值替换为 1。这是所需的输出:

零件键 日期 活力 损失函数
1 2021 年 2 月 1 日 585 .85
2 2021 年 2 月 1 日 1324 1
3 2021 年 2 月 1 日 869 .69

我的代码现在知道匹配 id 但不匹配日期,因此我得到一个变量(能量)的日期-id 组合的值,但另一个变量(损失因子)的所有日期的值。

SELECT tbl1.partkey, tbl1.date, tbl1.energy, IIf(IsNull(tbl3.lossfactor),1,tbl3.lossfactor) AS lossfctr FROM (tbl1 INNER JOIN tbl2 ON tbl2.partkey = tbl1.partkey ) left join tbl3 on tbl2.assignkey = tbl3.assignkey WHERE ( ((tbl1.partkey=1) OR (tbl1.partkey=2) OR (tbl1.partkey=3)) AND (tbl1.date=#2/1/2021#) AND (tbl3.dt=#2/1/2021#))

UNION

SELECT tbl1.partkey, tbl1.date, tbl1.energy, IIf(IsNull(tbl3.lossfactor),1,tbl3.lossfactor) AS lossfctr FROM (tbl1 INNER JOIN tbl2 ON tbl2.partkey = tbl1.partkey ) left join tbl3 on tbl1.date = tbl3.dt WHERE ( ((tbl1.partkey=1) OR (tbl1.partkey=2) OR (tbl1.partkey=3)) AND (tbl1.date=#2/1/2021#) AND (tbl3.dt=#2/1/2021#)); `

我还尝试在 id 和日期这两个列上进行左连接,但它给了我一个错误。

谢谢!这两个链接很有帮助: https: //support.microsoft.com/en-us/office/join-tables-and-queries-3f5838bd-24a0-4832-9bc1-07061a1478f6

https://support.microsoft.com/en-us/office/left-join-right-join-operations-ebb18b36-7976-4c6e-9ea1-c701e9f7f5fb

标签: ms-accessleft-joinfull-outer-join

解决方案


考虑:

SELECT Query1.partkey, Query1.date, Query1.energy, Nz([lossfactor],1) AS LF
FROM
    (SELECT tbl1.partkey, tbl1.Date, tbl1.energy, tbl2.assignkey
     FROM tbl1 INNER JOIN tbl2 ON tbl1.partkey = tbl2.partkey) AS  Query1 
LEFT JOIN tbl3 ON (Query1.date = tbl3.dt) AND (Query1.assignkey = tbl3.assignkey)
WHERE (((Query1.date)=#2/1/2021#));

推荐阅读