如何使用MINUS运算符查询无对应internal类别的sale交易
解决方法:获取有
sale类别但无对应internal类别的交易记录 方法1:使用NOT EXISTS(推荐)
SELECT t1.* FROM transaction t1 WHERE t1.transaction_category = 'sale' AND NOT EXISTS ( SELECT 1 FROM transaction t2 WHERE t2.transaction_id = t1.transaction_id AND t2.transaction_category = 'internal' );
逻辑说明:主查询筛选所有交易类别为sale的记录,子查询检查同一transaction_id下是否存在internal类别记录。若不存在,则保留该sale记录。
方法2:使用LEFT JOIN + IS NULL
SELECT t1.* FROM transaction t1 LEFT JOIN transaction t2 ON t1.transaction_id = t2.transaction_id AND t2.transaction_category = 'internal' WHERE t1.transaction_category = 'sale' AND t2.transaction_id IS NULL;
逻辑说明:将sale记录与同ID的internal记录左连接,未匹配到internal记录的行中,t2的字段会为NULL,通过筛选该条件得到目标结果。
方法3:使用MINUS运算符实现
如果坚持使用MINUS,可通过先筛选出符合条件的transaction_id,再关联原表获取完整记录:
SELECT t.* FROM transaction t WHERE t.transaction_category = 'sale' AND t.transaction_id IN ( -- 所有包含sale的transaction_id SELECT transaction_id FROM transaction WHERE transaction_category = 'sale' MINUS -- 所有包含internal的transaction_id SELECT transaction_id FROM transaction WHERE transaction_category = 'internal' );
逻辑说明:MINUS运算得到“有sale但无internal”的交易ID集合,再通过该集合筛选原表中的sale记录。
性能说明
由于表数据仅约5000行,即使无索引,上述三种方法的执行效率都能满足需求。若后续数据量增大,建议创建(transaction_id, transaction_category)联合索引,可大幅提升查询速度。
内容的提问来源于stack exchange,提问作者craftdeer
相关产品推荐
相关产品推荐

