0
votes

Comment nier une requête Sélectionner avec union?

Comment je peux rejoindre la table d'utilisateurs dans la requête ci-dessous. J'ai un nom d'utilisateur dans ma table d'utilisateurs que je souhaite afficher avec les résultats de la requête ci-dessous. Je veux me joindre à Userid à partir de la table des utilisateurs afin que je puisse récupérer des enregistrements à partir de la table des utilisateurs.

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 commentaires

Cette requête n'a pas de sens. Vous obtiendrez des lignes d'événementTracklog pour certains utilisateurs qui ne sont probablement pas le même utilisateur. Pourquoi n'utilisez-vous pas de rejoindre ici? Ou peut-être que ces deux choses sont isolées et que vous devez rejoindre tout ce genre à votre table d'utilisateurs? Aucune idée. Les données d'échantillonnage et la sortie souhaitée aideraient considérablement ici.


@Seanlange: Pouvez-vous me suggérer comment vous écrirez d'écrire une requête en ci-dessus?


3 Réponses :


0
votes

Vous pouvez utiliser rejoindre code> sur la table dérivée. En outre, vous devez utiliser union tout code> plutôt que union code>, de sorte que la requête n'aboutit pas en hauteur pour supprimer des doublons:

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;


0 commentaires

1
votes
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

0 commentaires

1
votes

Je suggérerais de ne pas nier la requête pour Union code> mais simplement rejoindre la table d'utilisateurs avec un ensemble de requêtes et commandez-le à l'aide du nom d'alias comme ci-dessous:

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


2 commentaires

Mais je vois que vous avez utilisé union dans cette requête


Oui, j'ai utilisé Union dans la requête principale mais récupérez et combine les données de données de deux tables différentes. Au-dessus, j'ai dit, nous pouvons simplement utiliser Union dans la requête principale au lieu d'utiliser dans la sous-requête.