2017-02-13 3 views
0

i ai deux tablesutilisant (non) dans jointure interne SQL

1) tbluser 2) Userlogin

tbluser se composent de

nom d'utilisateur et email

et userlogin ressemble à

create table userlogin 
(
username varchar(50), 
[date] datetime 
) 

je veux choisir email de tbluser et valider userlogin (tableau 2)

je veux email des employés du tableau 1 qui ne sont pas dans le tableau 2 avec plage de dates sélectionnée

donc je créé une procédure

alter proc TMSautomail 
@datefrm datetime, 
@dateto datetime 
as 
begin 
SELECT 
    tblUser.Email 
from 
    tblUser 
     inner join 
    userlogin 
     on 
     tblUser.UserName not in userlogin.username 
where userlogin.date between @datefrm and @dateto 
end 

il me montre l'erreur, quand je change la procédure à cette

alter proc TMSautomail 
@datefrm datetime, 
@dateto datetime 
as 
begin 
SELECT 
    tblUser.Email 
from 
    tblUser 
     left outer join 
    userlogin 
     on 
     tblUser.UserName = userlogin.username 
where userlogin.date between @datefrm and @dateto and userlogin.username is null 
end 

la procédure retourne colonne vide,

je veux chercher email de la table un et valider avec le nom d'utilisateur qui ne sont pas dans le tableau 2,

ma deuxième table se compose d'une entrée

il doit renvoyer toutes les lignes de la table un

+0

Il n'y a pas besoin de se joindre, ne pas en une sous-requête. –

+0

je l'ai utilisé aussi mais quand j'ajoute where clause il montre toutes les lignes –

+0

Ne montrez cette requête aussi –

Répondre

1

Utilisez NOT IN et une sous-requête:

CREATE PROCEDURE TMSautomail(
    @datefrm datetime, 
    @dateto datetime 
) 
AS 
BEGIN 

    SELECT u.Email 
    FROM tblUser u 
    WHERE u.Email NOT IN (
     SELECT Email 
     FROM tblUser u1 
      INNER JOIN UserLogin l 
       ON u1.Username = l.Username 
     WHERE l.Date BETWEEN @datefrm AND @dateto 
    ) 

END 
0

essayer,

SELECT u.Email 
    FROM tblUser u 
    WHERE NOT EXISTS (
     SELECT Email 
     FROM UserLogin l 
       WHERE u1.Username = l.Username 
     AND l.Date BETWEEN @datefrm AND @dateto 
    )