我要求我们的系统列出已发布优惠券的所有会员以及尚未发布优惠券的所有用户。我制作了一个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
如何撤销此脚本,以便仅提取尚未发布优惠券的用户..?
非常感谢任何帮助。
答案 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'