如何加入这两个表以返回所需的结果?

时间:2014-12-11 06:26:12

标签: sql sql-server

我有以下两个返回我想要的结果的查询,但我想通过连接将它们组合成一个select语句。我已经走到了这一步,但我仍然不善于理解联接,所以我需要一些帮助。

这是第一个查询:

SELECT aur.Asset_Id AS AssetId, pl.Program_Name AS AssetName, aur.Action,
aur.Action_Timestamp, u.name AS PrimaryUser, u1.name AS UpdatedByUser
FROM Audit_User_Roles aur
LEFT JOIN Users u ON aur.User_Id = u.User_Id
LEFT JOIN Users u1 ON aur.OUser_Id = u1.User_Id
LEFT JOIN Program_List pl ON pl.Asset_Id = aur.Asset_Id
WHERE aur.Role_Id = 1
ORDER BY AssetId, aur.Action_Timestamp DESC

这是第二个查询:

SELECT asur.Asset_id AS AssetId, pl.Program_Name AS AssetName, asur.Action,
asur.Action_Timestamp, u.name AS SecondaryUser, asur.Environment, 
u1.name AS UpdatedByUser
FROM Audit_Secondary_User_Roles asur
LEFT JOIN Users u ON asur.Manager_User_Id = u.User_Id
LEFT JOIN Users u1 ON asur.OUser_Id = u1.User_Id
LEFT JOIN Program_List pl ON pl.Asset_Id = asur.Asset_Id
ORDER BY AssetId, asur.Action_Timestamp DESC

第一个查询的输出示例:

| AssetId | AssetName | Action  | Action_Timestamp        | PrimaryUser | UpdatedByUser |
|    1    | TestProg  | Updated | 2014-12-11 13:25:27.483 | John Smith  | John Smith    |

第二个查询的输出示例:

| AssetId | AssetName | Action | Action_Timestamp         | SecondaryUser | Environment | UpdatedByUser |
|    1    | TestProg  | Insert | 2014-12-02 11:48:41.862  | Jane Doe      | TstA1       | John Smith    |

我希望它在一个结果中看起来像:

| AssetId | AssetName | Action  | Action_Timestamp        | PrimaryUser | SecondaryUser | Environment | UpdatedByUser |
|    1    | TestProg  | Updated | 2014-12-11 13:25:27.483 | John Smith  | NULL          | NULL        | John Smith    |
|    1    | TestProg  | Insert  | 2014-12-02 11:48:41.862 | NULL        | Jane Doe      | TstA1       | John Smith    |

如何修改这些查询以返回这些结果?

1 个答案:

答案 0 :(得分:1)

您实际上并不想要加入,而是联盟

SELECT aur.Asset_Id AS AssetId, pl.Program_Name AS AssetName, aur.Action,
aur.Action_Timestamp, u.name AS PrimaryUser, NULL AS SecondaryUser,
NULL AS Environment, u1.name AS UpdatedByUser
FROM Audit_User_Roles aur
LEFT JOIN Users u ON aur.User_Id = u.User_Id
LEFT JOIN Users u1 ON aur.OUser_Id = u1.User_Id
LEFT JOIN Program_List pl ON pl.Asset_Id = aur.Asset_Id
WHERE aur.Role_Id = 1
UNION
SELECT asur.Asset_id AS AssetId, pl.Program_Name AS AssetName, asur.Action,
asur.Action_Timestamp, NULL AS PrimaryUser, u.name AS SecondaryUser,
asur.Environment, u1.name AS UpdatedByUser
FROM Audit_Secondary_User_Roles asur
LEFT JOIN Users u ON asur.Manager_User_Id = u.User_Id
LEFT JOIN Users u1 ON asur.OUser_Id = u1.User_Id
LEFT JOIN Program_List pl ON pl.Asset_Id = asur.Asset_Id
ORDER BY AssetId, asur.Action_Timestamp DESC

基本上你只是修改每个查询,使它在"缺少"中有空值。列(相对于其他查询),然后使用UNION关键字将它们组合在一起。 ORDER BY仅在联合中最后一个查询的末尾被允许 - 它命令所有行而不考虑每行来自哪个查询分支 - 在你的情况下是完美的,因为你有相同的{无论如何,在每个查询中都会{1}}。