Reputation: 13
I have a third party application that generates data into a number of separate tables based on the release. The data format remains consistent, so unions can be performed on the different types of tables.
I would like to include fields from the two unions in one resulting dataset.
The first union is an list of equipment used and is produced using the following statement:
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
There can be multiple table entries for each piece of equipment in this table.
Here is the table structure:
Field,Type,Null,Key,Default
APP_UID,varchar(32),NO,PRI,null
APP_NUMBER,int(11),NO,,null
APP_STATUS,varchar(10),NO,,null
ROW,int(11),NO,PRI,null
GRID_EQUIPMENT_ID,int(11),YES,,null
GRID_EQUIPMENT_ID_LABEL,varchar(64),YES,,null
The second union is an inventory report produced using the following statement:
SELECT *
FROM (SELECT * FROM PMT_RPT_OLD
UNION
SELECT * FROM PMT_RPT_X
) AS A
ORDER BY A.APP_NUMBER
Here is the table structure:
Field,Type,Null,Key,Default
APP_UID,varchar(32),NO,PRI,null
APP_NUMBER,int(11),NO,,null
APP_STATUS,varchar(10),NO,,null
PROJECT_TITLE,varchar(255),YES,,null
PROJECT_CHARTER_NUMBER,varchar(32),YES,,null
COMPANY_CITY,varchar(32),YES,,null
COMPANY_COUNTRY,varchar(32),YES,,null
COMPANY_NAME,varchar(255),YES,,null
PROJECT_CHARTER_CLIENT_TYPE_LABEL,varchar(32),YES,,null
PROJECT_CHARTER_CLIENT_SECTOR_OTHER,varchar(255),YES,,null
PROJECT_CHARTER_CLIENT_SECTOR_LABEL,varchar(32),YES,,null
PROJECT_CHARTER_START_DATE,varchar(10),YES,,null
REQUEST_DATE,varchar(10),YES,,null
INQUIRY_DIV,varchar(32),YES,,null
CLIENT_CALLBACK_EXPLAIN,varchar(255),YES,,null
CLIENT_CALLBACK_LABEL,varchar(32),YES,,null
CLIENT_SURVEY_LABEL,varchar(32),YES,,null
PROJECT_CLOSEOUT_FEEDBACK_LABEL,varchar(32),YES,,null
PROJECT_CLOSEOUT_SURVEY_COMMENTS,varchar(255),YES,,null
PROJECT_COMPLETION_SIGNOFF_COMMENTS_PM,varchar(255),YES,,null
PROJECT_LOST_SIGNOFF_COMMENTS_PM,varchar(255),YES,,null
I would like to include fields from the report table in the equipment list where the APP_UID is identical.
Here's the challenge: the data is constantly being updated and I am passing the query to a reporting tool, so I'm limited to a single statement.
Is there a way to combine the two sets of tables and join them using one statement? If not, is there an alternative approach that I should consider?
Any hints would be appreciated!
Upvotes: 0
Views: 1447
Reputation: 33935
Note that your second query is functionally identical to the following:
SELECT * FROM PMT_RPT_OLD
UNION
SELECT * FROM PMT_RPT_X
ORDER BY APP_NUMBER
Upvotes: 1
Reputation: 4153
Yes there's a way to join 2 union select statements using mysql
Just like a normal join
Example :
Select * from tbl1 join tbl2 on tbl1.linkcolumn = tbl2.linkcolumn
Just simply replace tbl1/tbl2 to your Select union statement and add an alias to it.
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
Also there's no need to wrap your union into a subquery since this 2 select statement which is union have same table columns.
Put your
ORDER BY
after the JOIN statement
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
Upvotes: 1