求编写SQL语句查询从未售出商品的ID及描述(表连接与NULL问题)
从未售出商品的SQL查询方案
要列出从未售出的商品的itemid和itemdescription,你的原SQL思路方向是对的,但可能忽略了Sale表的作用——如果Sale_Item中的记录对应的订单是取消/无效状态,那这类商品其实不算真正售出,所以需要结合Sale表的有效订单来判断。
正确的SQL写法(基于有效订单判断)
使用NOT EXISTS子查询可以更精准地筛选出从未出现在有效订单中的商品:
SELECT item.itemid, item.itemdescription FROM item WHERE NOT EXISTS ( SELECT 1 FROM sale_item INNER JOIN sale ON sale_item.sale_id = sale.sale_id WHERE sale_item.item_id = item.itemid AND sale.status = '已完成' -- 替换为你实际业务中代表有效订单的状态值 );
原SQL的问题分析
如果你的业务中只要出现在Sale_Item里就算售出,那原SQL应该能生效,没得到正确结果可能是以下原因:
- 字段名/表名大小写不匹配(部分数据库如PostgreSQL区分大小写)
Sale_Item中存在无效关联记录,需要结合Sale表过滤有效订单- 数据库中存在脏数据,比如
Sale_Item的item_id为空值干扰判断
另一种写法(LEFT JOIN+过滤)
如果确认所有Sale_Item关联的都是有效订单,也可以调整原SQL确保字段匹配:
SELECT item.itemid, item.itemdescription FROM item LEFT JOIN sale_item ON item.itemid = sale_item.item_id WHERE sale_item.item_id IS NULL;
注意检查item.itemid和sale_item.item_id的字段类型、拼写是否完全一致。
内容的提问来源于stack exchange,提问作者Adam Riess
相关产品推荐
相关产品推荐

