【问题标题】:SQL Query replace UNION ALL with JOINS or somethingSQL Query 用 JOINS 或其他东西替换 UNION ALL
【发布时间】:2012-04-14 21:20:52
【问题描述】:

现在我有 3 张桌子

订单:

ID |日期 |机器 |规划

好作品:

ID |日期 |机器 |件 |产品

坏片:

ID |日期 |机器 |件 |产品 |组件

查询的输出是

日期 |机器 |规划 |好片|坏块

实际的查询是这样的:

SELECT
  data.Date AS Date,
  data.Machine AS Machine,
  SUM(CASE WHEN data.type = 'Planning' THEN data.value END ) AS Planning,
  SUM(CASE WHEN data.type = 'GoodPieces' THEN data.value END ) AS GoodPieces,
  SUM(CASE WHEN data.type = 'BadPieces' THEN data.value END ) AS BadPieces
FROM
      ( SELECT
          'Planning' AS Type,
          Date AS Date,
          Machine AS Machine,
          Planning AS Value
        FROM Orders
        UNION ALL
        SELECT
          'GoodPieces',
          Date,
          Machine,
          Pieces AS Value
        FROM GoodPieces
        UNION ALL
        SELECT
          'BadPieces'
          Date,
          Machine,
          Pieces AS Value
        FROM BadPieces ) AS data
GROUP BY
   Date,
   Machine

我的问题是有没有办法用这 3 个表获得相同的输出

订单:

ID |日期 |机器|规划

好作品:

订单ID |件 |产品

坏片:

订单ID |件 |产品 |组件

谢谢,

【问题讨论】:

    标签: sql union


    【解决方案1】:

    当然,只需在表格中添加LEFT JOIN 并对相应的列求和:

    SELECT
      O.Date,
      O.Machine,
      SUM(COALESCE(O.Planning, 0)) AS Planning,
      SUM(COALESCE(G.Pieces, 0)) AS GoodPieces,
      SUM(COALESCE(B.Pieces, 0)) AS BadPieces
    FROM
      Orders O
    LEFT JOIN
      (SELECT G.OrderID,
         SUM(COALESCE(G.Pieces, 0)) AS GoodPieces
       FROM GoodPieces G
       GROUP BY G.OrderID) G ON G.OrderID = O.ID
    LEFT JOIN
      (SELECT B.OrderID,
         SUM(COALESCE(B.Pieces, 0)) AS BadPieces
       FROM BadPieces B
       GROUP BY B.OrderID) B ON B.OrderID = O.ID
    GROUP BY
      O.Date,
      O.Machine;
    

    演示:http://www.sqlfiddle.com/#!3/09a73/17

    编辑:更新为在 cmets 中由@MikaelEriksson 给出的句柄点。

    【讨论】:

    • 如果OrderIDBadPieces 中是唯一的,这将起作用。尝试将 (8, 1) 添加到 BadPiecesBothTest 的计算会出错。
    • @MikaelEriksson:好点!我通过在子查询中将GoodPiecesBadPieces 中的数据与OrderID 相加来进行更新。现在,即使添加了您的案例,数据也匹配,在此处测试原始查询:sqlfiddle.com/#!3/1698e/3
    • SQL FIDDLE 我不知道那个页面..谢谢你这么匹配..谢谢你的解决方案
    • 还有一件事......我在 SQL Fiddle 中看到了执行计划,看起来 UNION ALL Qry 更好......这是真的吗?
    • 它们在我看来差不多。两者都涉及对所有三个表的表扫描和约 50% 的成本排序操作。如果您愿意,您也可以在 UNION ALL 方法中实现此功能,方法是将 Orders 数据加入每个子查询:sqlfiddle.com/#!3/09a73/21
    猜你喜欢
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 2018-10-28
    • 2011-04-13
    • 1970-01-01
    相关资源
    最近更新 更多