我有两个类似的SQL查询,它们只有不同的where子句过滤器来提取相应的管理员名称(point_of_contact,admin)。我需要生成结合两个筛选查询的结果的结果,我不知道如何解决这个问题。除了联系点和管理员之外,列是相同的。我需要admin和point_of_contact在不同的列中。有一个联系点或管理员但不是两个都留下一个空。我试过递归sql和case语句,我遇到了一些麻烦。我将查询分成两个简单的查询。 (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
答案 0 :(得分:1)
如果两个查询都提供了您想要的数据(??),那么为什么没有名称列,然后是名称类型列。
在第一个查询中,将DP.POINT_OF_CONTACT作为specialName。在此查询“Point of Contact”中添加一列作为nameType。
在第二个查询中,将“as ADMIN”更改为specialName。将列添加到查询“Admin”作为nameType。
您可能需要在第一个查询中执行一些project_title,但之后您应该能够UNION这两组结果。然后在您处理结果的后续查询中,您将能够在nameType列上进行操作。
这是你要去的方向吗?如果没有,则可能需要更多详细信息。 最佳尼克。
答案 1 :(得分: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'
NOT EXISTS应该更有效率,因为它会在找到满足子查询的一行时返回答案。另一方面,COUNT(*)将继续搜索满足子查询的所有行。
我遗漏了你的GROUP BY条款,因为我不明白你试图用它们做什么,因为没有涉及聚合函数。