从MySQL中的两个联合加入结果集

时间:2016-11-28 05:14:05

标签: mysql join union

我有一个第三方应用程序,它根据发布版本将数据生成到许多单独的表中。数据格式保持一致,因此可以对不同类型的表执行联合。

我想在一个结果数据集中包含两个联合的字段。

第一个联合是使用的设备列表,使用以下语句生成:

foldMapDefault f Nothing = mempty
foldMapDefault f (Just a) = f a

此表中的每个设备可以有多个表条目。

这是表结构:

foldMap

第二个联合是使用以下声明生成的库存报告:

Maybe

这是表结构:

SELECT *
  FROM (SELECT * FROM PMT_EQUIPMENT_USED_OLD
    UNION
  SELECT * FROM PMT_EQUIPMENT_USED_X
    ) AS U
WHERE U.GRID_EQUIPMENT_ID IS NOT NULL AND U.APP_STATUS <> 'CANCELLED' ORDER  BY U.APP_NUMBER, U.ROW

我想在设备列表中包含 APP_UID 相同的报表中的字段。

以下是挑战:数据不断更新,我将查询传递给报告工具,因此我只能使用一个语句。

有没有办法组合两组表并使用一个语句连接它们?如果没有,是否有其他方法我应该考虑?

任何提示都将不胜感激!

2 个答案:

答案 0 :(得分:1)

是的,有一种方法可以使用mysql加入2个联合选择语句

就像普通的加入一样

示例:

Select * from tbl1 join tbl2 on tbl1.linkcolumn = tbl2.linkcolumn

只需将tbl1 / tbl2替换为您的Select union语句并为其添加别名。

SELECT * 
FROM   (SELECT * 
        FROM   (SELECT * 
                FROM   pmt_equipment_used_old 
                UNION 
                SELECT * 
                FROM   pmt_equipment_used_x) AS U 
        WHERE  U.grid_equipment_id IS NOT NULL 
               AND U.app_status <> 'CANCELLED' 
        ORDER  BY U.app_number, 
                  U.row) AS TBL1 
       JOIN (SELECT * 
             FROM   (SELECT * 
                     FROM   pmt_rpt_old 
                     UNION 
                     SELECT * 
                     FROM   pmt_rpt_x) AS A 
             ORDER  BY A.app_number) AS TBL2 
         ON TBL1.app_uid = TBL2.app_uid 
  

此外,不需要将联合包装到子查询中,因为这两个选择语句是union具有相同的表列。

     

将您的ORDER BY放在JOIN声明

之后
SELECT * 
FROM   (SELECT * 
                FROM   pmt_equipment_used_old 
                UNION 
        SELECT * 
                FROM   pmt_equipment_used_x
        WHERE  grid_equipment_id IS NOT NULL 
               AND app_status <> 'CANCELLED') 
               AS TBL1 
       JOIN (SELECT * 
                     FROM   pmt_rpt_old 
                     UNION 
             SELECT * 
                     FROM   pmt_rpt_x
             ORDER  BY app_number) AS TBL2 
         ON TBL1.app_uid = TBL2.app_uid 
         ORDER BY TBL1.app_number, TBL1.row

答案 1 :(得分:1)

请注意,您的第二个查询在功能上与以下内容相同:

SELECT * FROM PMT_RPT_OLD
UNION
SELECT * FROM PMT_RPT_X
ORDER BY APP_NUMBER