代码之家  ›  专栏  ›  技术社区  ›  Bokambo

如何用UNION嵌套Select查询?

  •  1
  • Bokambo  · 技术社区  · 5 年前

    SELECT * FROM
    (
    select User_id ,login_date AS EventTime,'Login' AS ACTION
    from Users_Login_Log(nolock)
    where login_date > '2019-12-23 00:00:00.000'
    
    UNION
    
    select
     UserID, EventTimeStamp AS EventTime ,
     'Logout' AS ACTION
     from EventTrackLog(nolock) where  EventName = 'Default.Logout.Clicked' and EventTimeStamp > '2019-12-23 00:00:00.000'
    
    ) AS ES
    ORDER BY User_id DESC, EventTime DESC
    
    2 回复  |  直到 5 年前
        1
  •  0
  •   Gordon Linoff    5 年前

    你可以用 join 在派生表上。另外,你应该使用 union all union ,因此查询不会产生删除重复项的开销:

    select u.user_name, es.*
    from ((select User_id, login_date as EventTime, 'Login' AS action
           from Users_Login_Log
           where login_date > '2019-12-23'
          ) union all
          (select User_ID, EventTimeStamp AS EventTime, 'Logout' as action
           from EventTrackLog
           where EventName = 'Default.Logout.Clicked' and 
                 EventTimeStamp > '2019-12-23'
          )
         ) es join
         users u
         on es.User_Id = u.User_Id
    order by es.User_id desc, es.EventTime desc;
    
        2
  •  1
  •   Borik    5 年前
    SELECT * FROM
    (
    select User_id ,login_date AS EventTime,'Login' AS ACTION
    from Users_Login_Log(nolock)
    where login_date > '2019-12-23 00:00:00.000'
    
    UNION
    
    select
     UserID, EventTimeStamp AS EventTime ,
     'Logout' AS ACTION
     from EventTrackLog(nolock) where  EventName = 'Default.Logout.Clicked' and EventTimeStamp > '2019-12-23 00:00:00.000'
    
    ) AS ES
    join userTable on es.user_id = userTable.user_id
    ORDER BY User_id DESC, EventTime DESC
    
        3
  •  1
  •   Shushil Bohara    5 年前

    我建议不要嵌套查询 UNION 但只需将这两组查询连接到user表中,并使用别名对其排序,如下所示:

    SELECT ull.User_id AS UserID,
        ull.login_date AS EventTime,
        'Login' AS ACTION
    FROM Users_Login_Log(nolock) ull
    INNER JOIN usersTable ut ON ut.user_id = ull.user_id
    WHERE login_date > '2019-12-23 00:00:00.000'
    UNION
    SELECT et.UserID, 
        et.EventTimeStamp AS EventTime ,
        'Logout' AS ACTION
    FROM EventTrackLog(nolock) et
    INNER JOIN usersTable ut ON ut.user_id = et.user_id
    WHERE et.EventName = 'Default.Logout.Clicked' 
    AND et.EventTimeStamp > '2019-12-23 00:00:00.000'
    ORDER BY UserID DESC, EventTime DESC