如何列出未在SQL中发布的用户

时间:2013-10-30 13:27:49

标签: sql tsql

我要求我们的系统列出已发布优惠券的所有会员以及尚未发布优惠券的所有用户。我制作了一个SQL脚本来提取已发布优惠券的成员列表。这是代码:

SELECT DISTINCT
b.Email,
b.FirstName,
b.LastName,
b.MemberDisplayName AS DisplayName,
b.MemberID
FROM ClassAd a
INNER JOIN Member b ON b.MemberID = a.MemberID
WHERE a.PostType = 'CPN'
AND DATEDIFF(d, 0, GETDATE()) <= a.ExpirationDate
AND a.Viewable = 'Y'
AND b.SystemID = 1
AND b.Claimed = 'Y'
AND b.Email IS NOT NULL

如何撤销此脚本,以便仅提取尚未发布优惠券的用户..?

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:2)

外连接和null测试与连接相反 请注意,您需要使用外部联接(而不是在哪里)

SELECT DISTINCT
b.Email,
b.FirstName,
b.LastName,
b.MemberDisplayName AS DisplayName,
b.MemberID
FROM Member b  
Left Outer JOIN ClassAd a
  ON b.MemberID = a.MemberID
 AND a.PostType = 'CPN'
 AND DATEDIFF(d, 0, GETDATE()) <= a.ExpirationDate
 AND a.Viewable = 'Y'
 AND b.SystemID = 1
 AND b.Claimed = 'Y'
 AND b.Email IS NOT NULL
where a.MemberID is null  

你可以移动

 AND b.SystemID = 1
 AND b.Claimed = 'Y'
 AND b.Email IS NOT NULL

进入where但是以这种格式,查询优化器有机会在连接之前消除行

答案 1 :(得分:2)

发布优惠券的会员列表。

SELECT Email
     , FirstName
     , LastName
     , MemberDisplayName As DisplayName
     , MemberID
FROM   Member
WHERE  SystemID = 1
AND    Claimed = 'Y'
AND    Email IS NOT NULL
AND    EXISTS (
         SELECT *
         FROM   ClassAd
         WHERE  PostType = 'CPN'
         AND    ExpirationDate >= DateDiff(dd, 0, Current_Timestamp)
         AND    Viewable = 'Y'
         AND    MemberID = Member.MemberID
       )

要扭转逻辑,这将是一个简单的例子,使其成为NOT EXISTS

答案 2 :(得分:1)

这样的事情(未经测试)应该这样做:

SELECT DISTINCT
b.Email,
b.FirstName,
b.LastName,
b.MemberDisplayName AS DisplayName,
b.MemberID
FROM Member b
WHERE b.MemberID NOT IN 
     (SELECT a.MemberID 
        FROM ClassAd a
       WHERE a.PostType = 'CPN'
         AND DATEDIFF(d, 0, GETDATE()) <= a.ExpirationDate
         AND a.Viewable = 'Y')
AND b.SystemID = 1
AND b.Claimed = 'Y'
AND b.Email IS NOT NULL

答案 3 :(得分:1)

假设优惠券由表ClassAd表示,您可以使用NOT IN和子查询。

SELECT DISTINCT
b.Email,
b.FirstName,
b.LastName,
b.MemberDisplayName AS DisplayName,
b.MemberID
FROM Member b 
WHERE
b.memberID NOT IN (SELECT a.MemberID FROM ClassAd a WHERE  a.PostType = 'CPN' AND DATEDIFF(d, 0, GETDATE()) <= a.ExpirationDate AND a.Viewable = 'Y')
AND b.SystemID = 1
AND b.Claimed = 'Y'
AND b.Email IS NOT NULL

答案 4 :(得分:0)

SELECT *
FROM @Member a
LEFT JOIN @ClassAd b 
    ON a.MemberId = b.MemberId AND b.PostType = 'CPN'
        AND b.ExpirationDate >= GETDATE()
        AND b.Viewable = 'Y'
WHERE b.MemberId IS NULL
AND a.SystemId = 1
AND a.Claimed = 'Y'