【问题标题】:using (not in) in inner join sql在内部连接 ​​sql 中使用(不在)
【发布时间】:2017-07-01 00:47:16
【问题描述】:

我有两张桌子

1) tbluser 2) 用户登录

tbluser 由

用户名和电子邮件

和用户登录看起来像

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

我想从 tbluser 中选择电子邮件并验证用户登录(表 2)

我想要来自表 1 的员工的电子邮件,这些员工不在表 2 中,并且具有选定的日期范围

所以我创建了一个程序

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

它显示错误, 当我改变程序时 到这个

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

程序返回空白列,

我想获取表 1 的电子邮件并使用不在表 2 中的用户名进行验证,

我的第二张表由一个条目组成

它应该返回表一的所有行

【问题讨论】:

  • 不需要加入,只需要 NOT IN 和子查询。
  • 我也使用过,但是当我添加 where 子句时,它会显示所有行
  • 同时显示该查询
  • ok 子查询正在运行

标签: sql-server date stored-procedures inner-join notin


【解决方案1】:

使用NOT IN 和子查询:

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

【讨论】:

    【解决方案2】:

    试试这个,

    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
        )
    

    【讨论】:

      猜你喜欢
      • 2013-08-28
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多