多表筛选商品列表:获取无SupplierID=70记录的商品
问题分析
你的SQL核心问题出在**INNER JOIN SupplierData**这一步:
- 它会先筛选出所有在
SupplierData表中有记录(无论属于哪个供应商)的商品,之后再排除掉关联SupplierID=70的商品编号。 - 这会导致两个不符合预期的结果:
- 那些在
SupplierData表中完全没有任何供应商记录的商品,会被INNER JOIN直接过滤,根本出现在结果里; - 对于有其他供应商记录但无70号供应商的商品,
INNER JOIN会把这些其他供应商的对应行全部查出来,导致结果出现重复商品编号或多余的关联数据。
- 那些在
正确实现方法
方法1:LEFT JOIN + IS NULL
通过左连接仅关联SupplierID=70的记录,然后筛选出连接后无匹配结果的商品(即无70号供应商记录的商品):
SELECT a.artnr, a.ean FROM ArticleDB AS a LEFT JOIN SupplierData AS b ON a.artnr = b.artnr AND b.SupplierID = 70 WHERE b.SupplierID IS NULL;
方法2:NOT EXISTS
直接判断当前商品在SupplierData中不存在SupplierID=70的记录,逻辑更直观,性能表现也更稳定:
SELECT a.artnr, a.ean FROM ArticleDB AS a WHERE NOT EXISTS ( SELECT 1 FROM SupplierData AS b WHERE b.artnr = a.artnr AND b.SupplierID = 70 );
这两种方法都能准确获取所有无70号供应商记录的商品,既不会过滤掉完全没有供应商记录的商品,也不会拉出多余的其他供应商关联行。
内容的提问来源于stack exchange,提问作者GobSta
相关产品推荐
相关产品推荐

