【问题标题】:Join Multiple Tables from Different Months加入不同月份的多个表
【发布时间】:2023-04-10 03:26:02
【问题描述】:

鉴于我们在 MS Access 中有 3 个表,

表1

ID  MyName  Months
111 A         1
222 B         1
333 F         2
444 D         2
555 G         3
666 C         3

表2

ID  Income  Months
111 500       1
222 900       1
333 800       2
444 6000      2

表3

ID  Income  Months
555 65656   3
666 77777   3

我想将表 2 和 3 加入表 1,这样我的回报将是 表_结果

ID  NAME    Income  Months
111 A       500        1
222 B       900        1
333 F       800        2
444 D      6000        2
555 G     65656        3
666 C     77777        3

如何获取 Table_Result?

【问题讨论】:

标签: sql ms-access


【解决方案1】:

当您可以简单地将LEFT JOINNz 一起使用时,您不必使用UNION

SELECT T1.ID,T1.MyName as Name, Nz(T2.Income,T3.Income) as Income,T1.Months
FROM Table1 T1 LEFT JOIN
     Table2 T2 ON T1.ID=T2.ID LEFT JOIN
     Table3 T3 ON T1.ID=T3.ID
ORDER BY T1.ID

说明:

Nz 如果第一个参数是null,则函数返回第二个参数。阅读更多here

结果:

ID  MyName  Income  Months
111 A       500     1
222 B       900     1
333 F       800     2
444 D       6000    2
555 G       65656   3
666 C       77777   3

mysql SQL fiddle 中的示例结果(使用coalesce 代替Nz 用于mysql)

【讨论】:

  • 反对者,想解释一下吗?我的查询将得到 OP 想要的(检查和验证)。
  • 是的,这是一个完美的解决方案,不理解对此的反对意见
  • @Matt:谢谢伙计,我不知道谁投了反对票。我在检查它是否有效后发布了我的答案。
  • OP 没有发布任何限制,因此可以安全地假设 t2 和 t3 可以包含相同的 id,在这种情况下,此解决方案或 @Matt 解决方案均无效,联合是解决方案
  • @MladenOršolić:您的查询仅使用 Table2 和 Table3。那么如果那些 3 表之间没有关系,那么为什么 OP 在他的问题中添加 Table1 呢?我们如何获得名称字段?你的评论没有意义。
【解决方案2】:

试试这个查询

select  a.id,a.Myname,b.income,a.month
from table1 a
join table2 b on a.id=b.id
union all
select  a.id,a.Myname,c.income,a.month
from table1 a
join table3 c on c.id=a.id

【讨论】:

    【解决方案3】:
    SELECT A.ID, A.MYNAME, A.MONTHS, B.INCOME
    FROM Table1 AS A
    INNER JOIN (SELECT * FROM Table2 UNION SELECT * FROM Table3) AS B ON B.ID = A.ID
    

    【讨论】:

      【解决方案4】:

      你需要UNIONtable2和table3然后加入table1:

      SELECT table1.*, table4.income FROM table1 LEFT JOIN 
        (SELECT * FROM table2 UNION SELECT * FROM table3) as table4 
        ON table4.Months = table1.Months AND table4.ID = table1.ID
      

      您首先 UNION 两个 table2 和 table3 将它们的所有内容合并到一个“table4”中,然后您只需在匹配的 MonthsID 上执行 JOIN。如果您实际上并不需要 Months,您最终可能希望删除它。

      您也可以通过执行(table1 JOIN table2) UNION (table1 JOIN table3) 来获得相同的结果

      【讨论】:

        【解决方案5】:

        您可以使用 sql UNION 运算符从 2 个或多个表中获取单个记录集

        SELECT ID, Income, Months FROM table2
        UNION
        SELECT ID, Income, Months  FROM table3;
        

        使用UNION 解决您的问题的方法是:

        Select t1.ID, t1.MyName, Table_Result.Income, t1.Months
          from Table1 t1
          join (SELECT ID, Income, Months FROM table2
                UNION
                SELECT ID, Income, Months  FROM table3) as Table_Result on Table_Result.id = t1.id;
        

        如果您想要所有(也可以重复)值,您可以使用 ALL 修饰符作为 UNION 运算符

        Select t1.ID, t1.MyName, Table_Result.Income, t1.Months
          from Table1 t1
          join (SELECT ID, Income, Months FROM table2
                UNION ALL
                SELECT ID, Income, Months  FROM table3) as Table_Result on Table_Result.id = t1.id;
        

        这是最后一个例子的sql fiddle

        【讨论】:

        • 不包含名称,这是 OP 想要的
        • 花了一些时间来编辑它以包含我想提供的所有示例。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-17
        • 2014-12-10
        • 2016-03-13
        • 1970-01-01
        相关资源
        最近更新 更多