我有两个表,其中包含以下模式和数据

(
sale_id VARCHAR(18),
list_of_email_addresses VARCHAR(8000)
);

INSERT INTO sales (sale_id, list_of_email_addresses) VALUES ('12345', 'darba@snug.net, minty@snugs-canada.net, gravy@snugs.uk');
INSERT INTO sales (sale_id, list_of_email_addresses) VALUES ('12346', 'tinto@muse.com, muscles@muse.net, garbo@muse.net');
INSERT INTO sales (sale_id, list_of_email_addresses) VALUES ('12347', 'slick@bang.org, rick@bang.org, racer@bang.org');

CREATE TABLE accounts (
account_id VARCHAR(18),
domain_name VARCHAR(255));

INSERT INTO accounts ('A-000001', 'canada.ca');
INSERT INTO accounts ('A-000002', 'thisfuntime.com');
INSERT INTO accounts ('A-000003', 'bang.org');
INSERT INTO accounts ('A-000004', 'snug.net');

我希望标识Sales表中不具有BUSICE_DOMAIN_NAME部分匹配的帐户的记录,例如,我希望查找不具有匹配的DOMAIN_NAME字段的所有销售记录,也就是说,如果我可以成功执行连接,它将返回

'12346', 'tinto@muse.com, muscles@muse.net, garbo@muse.net'

注意:我们不会返回Sales_id=12345,b/c Snug.net匹配帐户A-000004的Sales行,因为没有任何帐户带有‘muse.com’或‘muse.net’-因此它是Any匹配,而不是All.

我们可以问相反的问题,哪些客户没有任何与其相关联的销售,这将返回

'A-000001', 'canada.ca'
'A-000002', 'thisfuntime.com'

我不能用Like Any这样做,因为我一次只能匹配一条记录,而且它只适用于单条记录.

不能 Select 获取Sales表并分解它,这样我们每个邮箱地址就会得到一行.在上面的例子中,我想排除任何与Sales_id=‘12345’匹配的销售,因为我正在try 排除任何对Snugs的销售,并且所有这些邮箱地址都与同一家公司相关联--但我必须使用的底层数据模型被打破了--每个这些"Sneg"帐户都与不同的公司相关联,即使它们实际上是同一家公司.

这说得通吗?

推荐答案

我会使用not exists通过一些regexarray函数筛选出记录.

select *
from sales t1
where not exists(select * 
                 from accounts t2 
                 where array_contains(t2.domain_name::variant, regexp_extract_all(t1.emails,'@([^,]+)',1,1,'e')))

Sql相关问答推荐

Oracle SQL中的累计总数

Postgres JSONB对象筛选

解析键-值对,根据值 Select ,并使用SQL创建新列

在多个联合中使用相同的SELECT SQL查询

在SQL中使用类别值将行转置为列

将重复的值更新为下一个空闲数字

雅典娜嵌套Json提取液

从字符串中删除";1、";和";2,";,而不删除";11、";和";12、";

导出部分条形码字符串GS1-128

在SQL中为两个日期之间的每个日期添加行

使用多个嵌套数组查询JSON数据

SQL按日期分组字段和如果日期匹配则求和

基于另一个(SAS、SQL)中的值更新列

最小非重复集的SQL查询

删除行而不使数据库超载

在特定条件下使用 LAG,确定要采用什么 LAG 值?

SQL Server - 复杂场景 - 比较状态并填充值到后续行

基于 Snowflake 的最大值创建新列

SQL查询以获取从特定可变日期看到的用户

如何在 Oracle 中获取此变量的值?