如何编写SQL查询:排除关联特定乐器的所有ID,以及排除instrumentnaam列含saxofoon的stuknr
嘿,这两个SQL需求我太熟了,给你整理了几种高效且易懂的实现方案,你可以根据自己的数据库类型和数据规模来选:
问题1:展示所有ID,排除关联特定乐器的ID
假设我们有主表(比如items,存储核心ID数据)和关联表(比如item_instruments,记录ID与乐器的关联关系),以下是几种靠谱的写法:
方法1:NOT EXISTS(性能最优推荐)
数据库优化器对NOT EXISTS的支持很好,尤其是当关联字段(比如item_id)有索引时,能快速定位到无匹配的记录:SELECT i.id FROM items i WHERE NOT EXISTS ( SELECT 1 FROM item_instruments ii WHERE ii.item_id = i.id AND ii.instrumentnaam = '你的目标乐器名称' -- 替换成实际要排除的乐器 );方法2:LEFT JOIN + IS NULL(逻辑直观)
这种写法新手更容易理解,通过左连接保留主表所有记录,再筛选出关联表无匹配的ID:SELECT i.id FROM items i LEFT JOIN item_instruments ii ON i.id = ii.item_id AND ii.instrumentnaam = '你的目标乐器名称' WHERE ii.item_id IS NULL;方法3:NOT IN(简洁但注意空值陷阱)
写法最简洁,但要警惕子查询返回的item_id包含NULL的情况——一旦有NULL,NOT IN会导致整个结果为空:SELECT id FROM items WHERE id NOT IN ( SELECT item_id FROM item_instruments WHERE instrumentnaam = '你的目标乐器名称' );
问题2:排除所有在instrumentnaam列中至少存在一条saxofoon记录对应的stuknr
也就是要找出从未关联过saxofoon的stuknr,以下是几种高效实现:
方法1:NOT EXISTS(最优推荐)
单表场景下用自连接的NOT EXISTS,性能出色,且逻辑清晰:SELECT DISTINCT s.stuknr FROM your_table s -- 替换成你的实际表名 WHERE NOT EXISTS ( SELECT 1 FROM your_table s2 WHERE s2.stuknr = s.stuknr AND s2.instrumentnaam = 'saxofoon' );注:如果
stuknr在表中本身是唯一的,可以去掉DISTINCT。方法2:GROUP BY + HAVING(适合统计场景)
通过分组统计每个stuknr下saxofoon的数量,筛选出数量为0的记录,适合需要同时查看其他统计数据的场景:SELECT stuknr FROM your_table GROUP BY stuknr HAVING SUM(CASE WHEN instrumentnaam = 'saxofoon' THEN 1 ELSE 0 END) = 0;方法3:LEFT JOIN + IS NULL(逻辑直观)
同样用左连接的思路,找到无saxofoon匹配的stuknr:SELECT DISTINCT s.stuknr FROM your_table s LEFT JOIN your_table s2 ON s.stuknr = s2.stuknr AND s2.instrumentnaam = 'saxofoon' WHERE s2.stuknr IS NULL;
内容的提问来源于stack exchange,提问作者Max Jansen
相关产品推荐
相关产品推荐

