比较/合并两个复杂查询的查询

时间:2021-05-17 11:50:38

标签: sql sql-server

我有两个疑问:

查询 #1:获取所有订阅

它返回哪个用户拥有哪个订阅

SELECT 
    S.ScheduleID, C.[Path] ObjectPath, U.UserName, 
    SB.[Description], S.StartDate, S.LastRunTime
FROM 
    ReportServer.dbo.ReportSchedule RS
INNER JOIN 
    ReportServer.dbo.Schedule S ON S.ScheduleID = RS.ScheduleID
INNER JOIN 
    ReportServer.dbo.[Catalog] C ON C.ItemID = RS.ReportID
INNER JOIN 
    ReportServer.dbo.Subscriptions SB ON SB.SubscriptionID = RS.SubscriptionID
INNER JOIN 
    ReportServer.dbo.Users U ON U.UserID = SB.OwnerID

结果:

+:-----------:+----------+--------+-------------+---------+----------------+
| ScheduleID |ObjectPath|UserName| Description |StartDate| LastRunTime    |
+:-----------:----------:--------:------------+---------+----------------+
| 6D28791    |          | MPE\gaq|             |         |                |
| 6D28782    |          | MPE\Sam|             |         |                |
| 6D281w2    |          |        |             |         |                |
|            |          |        |             |         |                |
|            |          |        |             |         |                |
+------------+----------+------+-----+---------+----------------+---------+
    

查询 #2:获取非活动帐户。

这将返回所有仍在服务器中的非活动用户

SELECT 
    CAT.Name, U.UserName, ROL.RoleName, ROL.Description, U.AuthType
FROM 
    dbo.Users U
INNER JOIN 
    dbo.PolicyUserRole PUR ON U.UserID = PUR.UserID
INNER JOIN 
    dbo.Policies POLICY ON POLICY.PolicyID = PUR.PolicyID
INNER JOIN 
    dbo.Roles ROL ON ROL.RoleID = PUR.RoleID
INNER JOIN 
    dbo.Catalog CAT ON CAT.PolicyID = POLICY.PolicyID 

结果:

+------------+----------+-------------+-----------+----------------+
| Name       |UserName  | RoleName    |Description|    Authtype    |
+------------+----------+-------------+-----------+----------------+
|Project X   |   MPE\asw|             |           |                |
|Project y   |   MPE\Sam|             |           |                |
|            |          |             |           |                |                
|            |          |             |           |                |                
|            |          |             |           |                |                
+------------+----------+-------------+-----------+----------------+
    

#Main 问题:查找所有订阅的非活动用户。

#我需要检查表1的“UserName”列中是否存在表2中“UserName”列的值。

有人知道怎么做吗?

到目前为止,我尝试加入两列,但每次都会出现错误。

SELECT 
    ScheduleID, UserName
FROM
    (SELECT 
         S.ScheduleID, C.[Path] ObjectPath, U.UserName, 
         SB.[Description], S.StartDate, S.LastRunTime
     FROM 
         ReportServer.dbo.ReportSchedule RS
     INNER JOIN 
         ReportServer.dbo.Schedule S ON S.ScheduleID = RS.ScheduleID
     INNER JOIN 
         ReportServer.dbo.[Catalog] C ON C.ItemID = RS.ReportID
     INNER JOIN 
         ReportServer.dbo.Subscriptions SB ON SB.SubscriptionID = RS.SubscriptionID
     INNER JOIN 
         ReportServer.dbo.Users U ON U.UserID = SB.OwnerID
) AS one
JOIN 
    (SELECT 
         CAT.Name, U.UserName, ROL.RoleName, ROL.Description, U.AuthType
     FROM 
         dbo.Users U
     INNER JOIN 
         dbo.PolicyUserRole PUR ON U.UserID = PUR.UserID
     INNER JOIN 
         dbo.Policies POLICY ON POLICY.PolicyID = PUR.PolicyID
     INNER JOIN 
         dbo.Roles ROL ON ROL.RoleID = PUR.RoleID
     INNER JOIN 
         dbo.Catalog CAT ON CAT.PolicyID = POLICY.PolicyID
) AS two ON one.ScheduleID = two.UserName

我收到此错误:

<块引用>

第 16 层,状态 1,第 2 行
不明确的列名“用户名”

1 个答案:

答案 0 :(得分:2)

您需要在第一个 select 语句中使用正确的别名:

SELECT 
    one.ScheduleID, one.UserName
FROM
    (SELECT 
         S.ScheduleID, C.[Path] ObjectPath, U.UserName, 
         SB.[Description], S.StartDate, S.LastRunTime
     FROM 
         ReportServer.dbo.ReportSchedule RS
     INNER JOIN 
         ReportServer.dbo.Schedule S ON S.ScheduleID = RS.ScheduleID
     INNER JOIN 
         ReportServer.dbo.[Catalog] C ON C.ItemID = RS.ReportID
     INNER JOIN 
         ReportServer.dbo.Subscriptions SB ON SB.SubscriptionID = RS.SubscriptionID
     INNER JOIN 
         ReportServer.dbo.Users U ON U.UserID = SB.OwnerID) AS one
WHERE one.UserName IN 
    (SELECT 
         U.UserName
     FROM 
         dbo.Users U
     INNER JOIN 
         dbo.PolicyUserRole PUR ON U.UserID = PUR.UserID
     INNER JOIN 
         dbo.Policies POLICY ON POLICY.PolicyID = PUR.PolicyID
     INNER JOIN 
         dbo.Roles ROL ON ROL.RoleID = PUR.RoleID
     INNER JOIN 
         dbo.Catalog CAT ON CAT.PolicyID = POLICY.PolicyID)
相关问题