2013-09-03 4 views
1

У меня есть два похожих sql-запроса, которые имеют только разные фильтры where clause, чтобы извлечь соответствующие имена администраторов (point_of_contact, admin). Мне нужно создать результаты, которые объединяют результаты как отфильтрованных запросов, так и я не был уверен, как это решить. Столбцы одинаковы, за исключением точки соприкосновения и администратора. Мне нужно, чтобы admin и point_of_contact были в разных столбцах. Существует либо точка контакта, либо админ, но не оба оставляют один нуль. Я пробовал рекурсивный sql, и заявления о делах, и у меня были проблемы. Я разделил запросы на два простых запроса ниже. (DB2 - не уверен в версии)слияния запросов с разными столбцами

SELECT 
       DP.DIM_PROJECT_ID, 
       DP.PROJECT_NAME, 
       DP.POINT_OF_CONTACT, 
       DP.FIELD, 
       DD.YEAR 

      FROM FACT_Table FAT 
      RIGHT OUTER JOIN DIM_A AS DA on FAT.DIM_A_ID = DA.DIM_A_ID 
      INNER JOIN DIM_P DP on DA.DIM_P_ID = DP.DIM_P_ID 
      INNER JOIN BRIDGE_USER BUP on BUP.BRIDGE_ID = DP.DIM_P_ID 
      INNER JOIN DIM_DATE DD on DD.DATE_KEY = DA.A_START_DATE_ID 
     WHERE DA.AWARD_CATEGORY <> 'N/A' 
     AND DD.YEAR = '2013' 
     and (
       SELECT count(BUP_INNER.ADMIN_FLAG) FROM BRIDGE_USER BUP_INNER 
       INNER JOIN DIM_P DP_INNER on BUP_INNER.DIM_P_ID = DP_INNER.DIM_P_ID 
       WHERE DP_INNER.DIM_P_ID = DP.DIM_P_ID 
        AND BUP_INNER.ADMIN_FLAG = 'Y' 
       ) = 0 
     GROUP BY DA.AWARD_TYPE_NAME, DA.AWARD_CATEGORY, DP.PROJECT_NAME, DP.POINT_OF_CONTACT, DD.YEAR 

и

SELECT distinct 
    DP.DIM_PROJECT_ID, 
    DU.NAME_LAST CONCAT ', ' CONCAT t1.NAME_FIRST AS ADMIN, 
    DP.PROJECT_NAME, 
    DP.PROJECT_TITLE, 
    DD.YEAR, 
    DP.FIELD 
FROM FACT_Table as FAT 
INNER JOIN DIM_P DP ON FAT.DIM_P_ID = DP.DIM_P_ID 
INNER JOIN BRIDGE_USER BUP on DP.DIM_P_ID = BUP.DIM_P_ID 
INNER JOIN DIM_USER DU ON FAT.DIM_USER_ID = DU.DIM_USER_ID 
INNER JOIN DIM_DATE DD on DD.DATE_KEY = DA.A_START_DATE_ID 
INNER JOIN DIM_A DA ON FAT.DIM_A_ID = DA.DIM_A_ID 

WHERE BUP.ADMIN_FLAG = 'Y' 
and DD.YEAR = '2013' 
and DA.AWARD_CATEGORY <> 'NA' 

) 
GROUP BY 
    DP.DIM_P_ID, 
    DU.NAME_LAST CONCAT ', ' CONCAT DU.NAME_FIRST, 
    DP.PROJECT_NAME, 
    DP.TITLE, 
    DD.YEAR, 
    DP.FIELD 

ответ

1

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

SELECT distinct 
     DP.DIM_PROJECT_ID, 
     DP.PROJECT_NAME, 
     DP.PROJECT_TITLE, 
     null as admin, 
     DP.POINT_OF_CONTACT, 
     DP.FIELD, 
     DD.YEAR 

    FROM FACT_Table FAT 
    RIGHT OUTER 
    JOIN DIM_A  DA on FAT.DIM_A_ID = DA.DIM_A_ID 
    JOIN DIM_P  DP on DA.DIM_P_ID = DP.DIM_P_ID 
    JOIN BRIDGE_USER BUP on BUP.BRIDGE_ID = DP.DIM_P_ID 
      JOIN DIM_DATE  DD on DD.DATE_KEY = DA.A_START_DATE_ID 
    WHERE DA.AWARD_CATEGORY <> 'N/A' 
    and DD.YEAR = '2013' 
    and NOT EXISTS (
        SELECT * 
         FROM BRIDGE_USER BUP_INNER 
         JOIN DIM_P  DP_INNER 
          on DP_INNER.DIM_P_ID = BUP_INNER.DIM_P_ID 
         WHERE DP_INNER.DIM_P_ID = DP.DIM_P_ID 
         AND BUP_INNER.ADMIN_FLAG = 'Y' 
        ) 
UNION ALL 

SELECT distinct 
    DP.DIM_PROJECT_ID, 
    DP.PROJECT_NAME, 
    DP.PROJECT_TITLE, 
    DU.NAME_LAST CONCAT ', ' CONCAT t1.NAME_FIRST AS ADMIN, 
    null as POINT_OF_CONTACT, 
    DD.YEAR, 
    DP.FIELD 
    FROM FACT_Table as FAT 
    JOIN DIM_P   DP ON FAT.DIM_P_ID = DP.DIM_P_ID 
    JOIN BRIDGE_USER BUP on BUP.DIM_P_ID = DP.DIM_P_ID 
          and BUP.ADMIN_FLAG = 'Y' 
    JOIN DIM_USER  DU ON FAT.DIM_USER_ID = DU.DIM_USER_ID 
    JOIN DIM_DATE  DD on DD.DATE_KEY = DA.A_START_DATE_ID 
          and DD.YEAR = '2013' 
    JOIN DIM_A   DA ON DA.DIM_A_ID = FAT.DIM_A_ID 
          and DA.AWARD_CATEGORY <> 'NA' 

НЕ СУЩЕСТВУЕТ должно быть более эффективным, поскольку он возвращает ответ в тот момент, одна строка найдена, удовлетворяющую подзапрос. COUNT (*), с другой стороны, продолжит поиск всех строк, удовлетворяющих подзапросу.

Я отказался от предложений GROUP BY, потому что я не понимал, что вы пытаетесь с ними сделать, поскольку не задействованы агрегированные функции.

+0

Вы также можете попробовать заменить логику 'NOT EXISTS'' LEFT EXCEPTION JOIN' на подзапрос. Вы можете проверить Visual Explain, чтобы узнать, какая из них более эффективна. – WarrenT

1

если оба запроса дают данные, которые вы хотите (??), то почему бы не иметь столбец имени, а затем столбец типа имя.

В первом запросе поставьте DP.POINT_OF_CONTACT как specialName. Добавьте столбец к этому запросу «Точка контакта» как nameType.

Во втором запросе измените «как ADMIN» на specialName. Добавьте столбец в запрос «Admin» как nameType.

Возможно, вам придется что-то сделать с тем, чтобы иметь проект project_title в первом запросе, но затем вы должны иметь возможность UNION выполнять два набора результатов. Затем в ваших последующих запросах, обрабатывающих результаты, вы сможете манипулировать в столбце nameType.

Это направление, в котором вы направлялись? Если нет, то может потребоваться больше деталей в вопросе. Лучший Ник.

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