一次选择特定值时排除电子邮件列表

Excluding email lists while selecting specific values at once

我想在 1 个 SELECT 查询中做两件事(我知道我可以分两步完成,但我想避免中间表):

  1. Select 来自 TABLE 'anothertable'.[=18= 的特定值(仅限 M 和 W——还有其他可能的值,但我只想要这两个而不是其他值) ]
  2. 同时避免选择退出和退回电子邮件(11k 行,<5 列)。

我不确定语法是否正确,因为查询一直在加载。大小应该不是问题(27k 行,<5 列和 2 个核心处理器)。

BEGIN

CREATE TABLE `mytable` AS (

SELECT * FROM `anothertable` A

WHERE NOT EXISTS (SELECT Email FROM `optout` B WHERE B.Email = A.Email)
AND NOT EXISTS (SELECT Email FROM `allbounced` C WHERE C.emailbounced = A.Email)

GROUP BY Email
HAVING 
(SUM(CASE WHEN target = 'M' THEN 1 ELSE 0 END) > 0 OR   -- MAN  is present
SUM(CASE WHEN target = 'W' THEN 1 ELSE 0 END) > 0 AND   -- WOMAN  is present
SUM(CASE WHEN target NOT IN ('M', 'W') THEN 1 ELSE 0 END) = 0)  -- only MAN or WOMAN

);

END

如果可能,您应该使用 NOT IN 而不是 NOT EXISTS。这应该更快:

BEGIN

CREATE TABLE `mytable` AS (

SELECT Email FROM `anothertable` A
WHERE Email NOT IN (SELECT Email FROM `optout`)
AND Email NOT IN (SELECT emailbounced FROM `allbounced`)

GROUP BY Email
HAVING 
(SUM(CASE WHEN target = 'M' THEN 1 ELSE 0 END) > 0 OR   -- MAN  is present
SUM(CASE WHEN target = 'W' THEN 1 ELSE 0 END) > 0 AND   -- WOMAN  is present
SUM(CASE WHEN target NOT IN ('M', 'W') THEN 1 ELSE 0 END) = 0)  -- only MAN or WOMAN

);

END