SQL Server无需临时表:优先获取非NULL Vendor相关字段记录的方法
解决方案:优先获取非NULL记录,无则取NULL记录(无需临时表)
嗨,这里有几个不用临时表就能满足你需求的实用SQL方案,你可以根据自己使用的数据库类型选择合适的:
方案1:使用ROW_NUMBER()窗口函数(通用大部分数据库)
这个方法灵活性很高,不管你的原始查询有多复杂都能适配,原理是给记录按优先级排序,优先保留非NULL的那条:
WITH ranked_records AS ( SELECT *, -- 给非NULL的记录标记为0,NULL的标记为1,排序后0在前 ROW_NUMBER() OVER (ORDER BY CASE WHEN VendorCode IS NOT NULL AND VendoroffsetAccount IS NOT NULL THEN 0 ELSE 1 END ) AS record_rank FROM ( -- 这里替换成你原来的查询语句 SELECT * FROM your_original_query ) AS source_data ) SELECT * EXCLUDE record_rank -- 或者直接列出需要的字段,去掉record_rank FROM ranked_records WHERE record_rank = 1;
解释:通过CTE给每条记录分配一个排名,非NULL的记录排名为1,NULL的为2,最后只取排名第一的记录。如果只有NULL记录,那它的排名就是1,自然会被选中。
方案2:使用TOP 1 + ORDER BY(适合SQL Server、Access等支持TOP的数据库)
如果你的数据库支持TOP语法,这个方案会更简洁:
SELECT TOP 1 * FROM ( -- 替换成你原来的查询语句 SELECT * FROM your_original_query ) AS source_data ORDER BY CASE WHEN VendorCode IS NOT NULL AND VendoroffsetAccount IS NOT NULL THEN 0 ELSE 1 END;
解释:直接按优先级排序后取第一条记录,逻辑和方案1一致,只是写法更紧凑。
方案3:使用聚合函数(适合其他字段无差异的场景)
如果两条记录除了VendorCode和VendoroffsetAccount之外,其他字段都完全相同,那可以用聚合函数快速获取非NULL值:
SELECT COALESCE(MAX(VendorCode), VendorCode) AS VendorCode, COALESCE(MAX(VendoroffsetAccount), VendoroffsetAccount) AS VendoroffsetAccount, -- 其他字段直接列出来(因为两条记录这些字段相同) other_field_1, other_field_2 FROM ( -- 替换成你原来的查询语句 SELECT * FROM your_original_query ) AS source_data GROUP BY other_field_1, other_field_2;
解释:MAX()会自动忽略NULL值,所以如果存在非NULL记录,就会取到那个有效值;如果只有NULL记录,COALESCE会返回NULL值本身。
内容的提问来源于stack exchange,提问作者Alberto
相关产品推荐
相关产品推荐

