如何基于同表其他行过滤数据?SQL筛选job1行求助
过滤Job1中与Job2存在相同ID的数据行
首先是测试用的建表和插入数据SQL:
CREATE TABLE YourTableName ( Id UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(), Job VARCHAR(255), Action VARCHAR(MAX) ); INSERT INTO YourTableName (Job, Action) VALUES ('job1', '1E2B7D03-955E-46B0-BE35-0506C01CF68D/job1'), ('job1', '2CE87455-0AC5-4F5A-B0EA-66D8279E81D1/job1'), ('job1', '3CE87455-0AC5-4F5A-B0EA-66D8279E81D1/job1'); INSERT INTO YourTableName (Job, Action) VALUES ('job2','1E2B7D03-955E-46B0-BE35-0506C01CF68D/job2'), ('job2','4E2B7D03-955E-46B0-BE35-0506C01CF68D/job2');
需求说明
获取所有Job为'job1'的数据行,但如果某行Action字段里的ID部分(/之前的字符串),在Job为'job2'的行中存在相同ID,则排除该行。
预期结果
('job1', '2CE87455-0AC5-4F5A-B0EA-66D8279E81D1/job1') ('job1', '3CE87455-0AC5-4F5A-B0EA-66D8279E81D1/job1')
原因:第一条job1数据的Action中的ID(1E2B7D03-955E-46B0-BE35-0506C01CF68D)在job2的数据行中存在,因此需排除。
尝试方案的问题
你之前写的子查询逻辑有误,错误地截取了/后面的部分进行匹配,导致结果不符合预期:
SELECT * FROM YourTableName j1 WHERE Job = 'job1' AND NOT EXISTS (SELECT 1 FROM YourTableName j2 WHERE Job = 'job2' AND SUBSTRING(j1.Action, CHARINDEX('/', j1.Action) + 1, 36) = SUBSTRING(j2.Action, CHARINDEX('/', j2.Action) + 1, 36) );
正确的SQL查询语句
SELECT * FROM YourTableName j1 WHERE Job = 'job1' AND NOT EXISTS ( SELECT 1 FROM YourTableName j2 WHERE Job = 'job2' AND LEFT(j1.Action, CHARINDEX('/', j1.Action) - 1) = LEFT(j2.Action, CHARINDEX('/', j2.Action) - 1) );
逻辑解释
LEFT(j1.Action, CHARINDEX('/', j1.Action) - 1):从Action字段中提取/之前的ID字符串,这才是需要匹配的核心内容。NOT EXISTS子查询会检查job2中是否存在相同ID的行,若存在则排除对应的job1行,完全符合需求。
内容的提问来源于stack exchange,提问作者RheinmetallSkorpion
相关产品推荐
相关产品推荐

