2016-11-28 4 views
0

У меня есть стороннее приложение, которое генерирует данные в несколько отдельных таблиц на основе выпуска. Формат данных остается согласованным, поэтому объединения могут выполняться на разных типах таблиц.Объединение наборов результатов из двух союзов в MySQL

Я хотел бы включить поля из двух объединений в один результирующий набор данных.

Первый союз является перечень используемого оборудования и производится с помощью следующего оператора:

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 

Там может быть несколько записей таблицы для каждой единицы оборудования в этой таблице.

Вот структура таблицы:

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 

Второй союз является отчет об инвентаризации производится с помощью следующего оператора:

SELECT * 
    FROM (SELECT * FROM PMT_RPT_OLD 
    UNION 
    SELECT * FROM PMT_RPT_X 
    ) AS A 
ORDER BY A.APP_NUMBER 

Вот структура таблицы:

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 

Я хотел бы включить поля из таблицы отчетов в список оборудования, где APP_UID идентичен.

Задача: данные постоянно обновляются, и я передаю запрос инструменту отчетности, поэтому я ограничен одним утверждением.

Есть ли способ объединить два набора таблиц и присоединиться к ним с помощью одного утверждения? Если нет, есть ли альтернативный подход, который я должен рассмотреть?

Любые советы были бы оценены!

+0

Можете ли вы показать структуру таблицы для таблиц, участвующих в два запроса? Кстати, вы можете отбросить подзапросы, а вместо этого просто «UNION» вместе два оператора select на одном уровне.Это также должно значительно ускорить работу. –

+0

какая колонка, которая связывает эти 2 таблицы друг с другом? – Beginner

+1

См. Http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql- query – Strawberry

ответ

1

Да, есть способ, чтобы присоединиться к 2 накидные операторов выбора Использование MySQL

Так же, как нормальный присоединиться

Пример:

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

Просто замените tbl1/tbl2 на ваш Выбор союза и добавьте к нему псевдоним.

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 

Кроме того, нет никакой необходимости, чтобы обернуть ваш союз в подзапрос с этим 2 выберите утверждение, которое является объединение имеет одинаковые столбцы таблицы.

Поместите 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 
+2

Я не думаю, что вам нужно обернуть запросы 'UNION' в подзапросах. –

+0

Я никогда не слышал о том, чтобы упорядочить две стороны соединения, а результат должен быть заказан позже. То же самое справедливо и для заказа двух частей союза. –

+0

@TimBiegeleisen извините моя ошибка. – Beginner

1

Обратите внимание, что ваш второй запрос функционально идентичен следующему:

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

Пока я согласен с вами, это не полный ответ, что даже не возможно, потому что OP опущена структура таблицы. –

+0

Вот почему я голосовал, чтобы закрыть вопрос – Strawberry

Смежные вопросы