Sql server T-SQL:[列]不象[从另一个选择中选择任何值]

Sql server T-SQL:[列]不象[从另一个选择中选择任何值],sql-server,tsql,Sql Server,Tsql,我有一张表shop,上面有一个Email栏 另外,我还有另一个表Unsubscribed,其中有一个EmailPattern列 如何仅选择Email列与EmailPattern表中的Unsubscribed值不匹配的店铺 例如: “取消订阅”有以下记录: aaa bbb ccc 我预期的结果如下: select * from Shop where Email not like "%aaa%" and Email not like "%bbb%" and Email not li

我有一张表
shop
,上面有一个
Email

另外,我还有另一个表
Unsubscribed
,其中有一个
EmailPattern

如何仅选择
Email
列与
EmailPattern
表中的
Unsubscribed
值不匹配的店铺

例如:

“取消订阅”有以下记录:

aaa
bbb
ccc
我预期的结果如下:

select * 
from Shop 
where Email not like "%aaa%" 
  and Email not like "%bbb%" 
  and Email not like "%ccc%"
这将有助于:

-- setup test tables
CREATE TABLE #Shop (ID INT, Email VARCHAR(100));
CREATE TABLE #Unsubscribed (EmailPattern VARCHAR(100));

-- fill with example data
INSERT #Shop VALUES (1,'test@a.com');
INSERT #Shop VALUES (2,'david@r.com');
INSERT #Shop VALUES (3,'user@r.com');
INSERT #Shop VALUES (4,'george@usa.com');
 -- general phrase
INSERT #Unsubscribed VALUES ('test');
 -- specific email
INSERT #Unsubscribed VALUES ('user@r.com');
--INSERT #Unsubscribed VALUES ('@'); -- watch out, this will match every email!
--INSERT #Unsubscribed VALUES ('_'); -- so will this

-- filter results:
-- This returns rows from Table A (Shop), when they do not match anything in table B (Unsubscribed)
SELECT
    A.*
FROM
    #Shop A
    LEFT JOIN #Unsubscribed B ON A.Email LIKE '%' + B.EmailPattern + '%'
WHERE
    B.EmailPattern IS NULL;

DROP TABLE #Shop;
DROP TABLE #Unsubscribed;

请注意,如果某些短语或字符进入取消订阅模式,它可能会匹配每个记录

请支持你的主张,它更有效。您发布的查询使用带筛选器的左联接运算符;WHERE NOT EXISTS直接使用左反半联接。当您向#Shop添加更多行时,有利于后者的(轻微)性能差异会增加。在MS-SQL 2008和2012上测试。另请参阅:本文阅读效果良好,感谢链接。我不知道这种方法。我的断言已被删除。在业余时间,我将使用此特定示例测试此断言,但使用大型数据集。您可以在#Shop中使用标识列,而不是手动指定ID。然后您可以多次执行
INSERT to#Shop(Email)SELECT Email FROM#Shop
以获得一个大型数据集(结果并不特别重要)
-- setup test tables
CREATE TABLE #Shop (ID INT, Email VARCHAR(100));
CREATE TABLE #Unsubscribed (EmailPattern VARCHAR(100));

-- fill with example data
INSERT #Shop VALUES (1,'test@a.com');
INSERT #Shop VALUES (2,'david@r.com');
INSERT #Shop VALUES (3,'user@r.com');
INSERT #Shop VALUES (4,'george@usa.com');
 -- general phrase
INSERT #Unsubscribed VALUES ('test');
 -- specific email
INSERT #Unsubscribed VALUES ('user@r.com');
--INSERT #Unsubscribed VALUES ('@'); -- watch out, this will match every email!
--INSERT #Unsubscribed VALUES ('_'); -- so will this

-- filter results:
-- This returns rows from Table A (Shop), when they do not match anything in table B (Unsubscribed)
SELECT
    A.*
FROM
    #Shop A
    LEFT JOIN #Unsubscribed B ON A.Email LIKE '%' + B.EmailPattern + '%'
WHERE
    B.EmailPattern IS NULL;

DROP TABLE #Shop;
DROP TABLE #Unsubscribed;