【问题标题】:SQL UNION ALL with a INNER JOIN带有 INNER JOIN 的 SQL UNION ALL
【发布时间】:2011-07-11 05:40:11
【问题描述】:

我正在寻找显示两个表中所有行的最佳方式,同时先通过一个字段 (dwg) 连接,然后在适用的情况下进行第二次连接。

表 1 数据由示意图 (dwg) 以及构建图中所示项目所需的零件列表组成。表 2 包含有关为构建原理图而订购的实际部件的数据。 table2 中的某些部分是 table1 中的部分组合(例如:table1 中的 foo 和 bar 在 table2 中被排序为 foobar)。

我可以使用 UNION ALL 显示两个表中的所有行,但这不会同时连接 dwg 和部分字段。我也查看了 FULL OUTER JOIN,但我还没有弄清楚如何先通过 dwg 加入,然后再按部分加入。以下是数据示例。

table1                   table2   
dwg        part    qty       order   dwg      part    qty  
-----      -----   -----    -----    -----   -----   -----  
123        foo     1        ord1     123     foobar  1  
123        bar     1        ord1     123     bracket 2  
123        widget  2        ord2     123     screw   4  
123        bracket 4        ord2     123     nut     4  
456        foo     1        ord2     123     widget  2  
                            ord2     123     bracket 2  
                            ord3     456     foo     1  

所需的输出:
目标是创建一个视图,为 table1 中的所有部件和 table2 中的关联订单提供可见性(包括出现在一个表中但不在另一个表中的那些部件),以便我可以看到 table1 中的所有绘图部件和关联的记录在 table2 以及 table2 中的记录,其中部分不在 table1 中。

part_request_order_report  
dwg      part      qty   order   part    qty  
-----    -----     ----- ------  -----   -----  
123      foo       1  
123      bar       1  
123      widget    2     ord2    widget  2  
123      bracket   4     ord1    bracket 2  
123      bracket   4     ord2    bracket 2  
123                      ord1    foobar  1  
123                      ord1    screw   4  
123                      ord1    nut     4  
456      foo       1     ord3    foo     1  

这可能吗?还是我最好遍历数据来构建报告表?提前致谢。

【问题讨论】:

    标签: sql join view union


    【解决方案1】:

    这应该会给你正确的结果:

    select
        coalesce(table1.dwg,table2.dwg),
        table1.part,
        table1.qty,
        table2.order,
        table2.part,
        table2.qty,
    from table1
    full outer join table2 on 
        table1.dwg = table2.dwg and
        table1.part = table2.part
    

    【讨论】:

    • ITYM 合并(table1.dwg,table2.dwg)
    • 谢谢你们!那行得通!我在搜索中没有偶然发现合并功能。
    【解决方案2】:

    看起来FULL JOIN 是正确的方法。试试这个:

    SELECT A.dwg, A.part, A.qty, B.order, B.part, B.qty
    FROM table1 A
    FULL JOIN table2 B
    ON A.dwg = B.dwg AND A.part = B.part
    

    【讨论】:

    • ITYM coalesce(A.dwg,B.dwg) 因为结果可能包括没有来自 A 的数据的行。
    • @Lamack - 感谢您的帮助。我能够使用您的解决方案返回基本相同的结果(在我将 B.dwg 添加到选择标准之后)。一种方法比另一种方法有优势吗?可能在性能方面?
    猜你喜欢
    • 1970-01-01
    • 2018-09-21
    • 2013-07-01
    • 2020-12-30
    • 1970-01-01
    • 2016-12-29
    • 2012-04-02
    • 2012-01-25
    • 2018-03-30
    相关资源
    最近更新 更多