MySQL查询未分配给客户的卡列表无结果问题求助
问题分析与解决
你的查询语句确实有误,并不是所有卡都已分配——从数据里能看到cards表中的333333并没有出现在customers表的CardNo字段里,属于未分配的卡。
原语句的问题
你写的NOT EXISTS子查询没有关联两张表的CardNo,它只是判断customers表中是否存在非空的CardNo。而你的customers表显然有非空的CardNo,所以NOT EXISTS的结果永远是false,自然查不到任何数据。
正确的查询方式
这里提供几种可行的写法:
1. 关联两张表的NOT EXISTS写法
SELECT * FROM cards WHERE NOT EXISTS ( SELECT 1 FROM customers WHERE customers.CardNo = cards.CardNo );
这个写法的逻辑是:对cards里的每一行,检查customers中是否存在相同的CardNo,如果不存在就保留这行数据。
2. LEFT JOIN 筛选匹配为空的行
SELECT cards.* FROM cards LEFT JOIN customers ON cards.CardNo = customers.CardNo WHERE customers.CardNo IS NULL;
逻辑是:将两张表按CardNo左连接,那些在customers中没有匹配的行,对应的customers.CardNo会是NULL,筛选这些行即可得到未分配的卡。
3. NOT IN 写法(注意空值情况)
SELECT * FROM cards WHERE CardNo NOT IN ( SELECT CardNo FROM customers WHERE CardNo IS NOT NULL -- 排除customers中CardNo为空的情况,避免NOT IN返回空 );
如果customers表的CardNo可能存在空值,一定要加上WHERE CardNo IS NOT NULL,否则NOT IN会因为包含空值而返回空结果。
以上几种写法都能正确返回未分配的卡333333。
内容的提问来源于stack exchange,提问作者user979331
相关产品推荐
相关产品推荐

