如何为多表关联的MS SQL查询实现增量分页并解决绑定错误
解决MS SQL Server 2012多表关联查询的增量分页问题
我来帮你搞定这个问题!你碰到的multipart identifier could not be bound错误,说白了就是外层查询找不到你引用的列——要么是你在外面直接用了子查询里没暴露的原表列,要么是子查询里没把需要的列都选出来。咱们把你的多表查询套进你熟悉的ROW_NUMBER结构里,调整一下写法就能解决。
方法一:基于ROW_NUMBER的分页(和你单表的用法逻辑一致)
把你的完整多表关联查询作为子查询,在子查询内部添加ROW_NUMBER(),同时确保所有需要的列都被选中并正确别名,外层查询只需要筛选行号范围即可:
SELECT Urun_kodu, Siparis_No, firmaadi, Siparis_Kodu, tarih1, eposta, haberdar, onay, uy_id FROM ( SELECT siparis_detay.[kodu] as [Urun_kodu], siparisler.[id] as [Siparis_No], [firmaadi], siparisler.[kodu] as Siparis_Kodu, siparisler.[tarih] as tarih1, siparisler.[eposta], uyelik.[haberdar], uyelik.[onay], siparisler.[uy_id], -- 按原查询的排序规则生成行号,保证分页连续性 ROW_NUMBER() OVER(ORDER BY siparisler.id DESC) AS Rownumber FROM siparis_detay INNER JOIN siparisler ON siparis_detay.sp_id = siparisler.id INNER JOIN urunler ON siparis_detay.kodu = urunler.kodu INNER JOIN uyelik ON siparisler.uy_id = uyelik.id WHERE siparisler.[durum] LIKE 'kargo%' AND siparis_detay.kodu='ac011' AND uyelik.[haberdar]=0 AND uyelik.[onay]=1 GROUP BY siparis_detay.[kodu], firmaadi, siparisler.[id], siparisler.[kodu], siparisler.[tarih], siparisler.[eposta], siparisler.[uy_id], uyelik.[haberdar], uyelik.[onay] ) AS t -- 筛选分页范围,比如取第101到200条(ROW_NUMBER从1开始计数) WHERE t.Rownumber > 100 AND t.Rownumber <= 200 ORDER BY t.Rownumber
为什么之前会报错?
你之前的尝试大概率是在外部查询中直接引用了原表的列(比如uyelik.haberdar),但外层查询只能识别子查询t中暴露的列,不能直接使用原表名+列名的格式。另外要确保ROW_NUMBER()的排序字段在子查询中存在,这里沿用了你原查询的ORDER BY siparisler.id DESC,保证分页结果的顺序和原查询一致。
方法二:SQL Server 2012新增的OFFSET FETCH分页(更简洁)
SQL Server 2012开始支持OFFSET...FETCH NEXT语法,这是官方推荐的分页方式,写法更简洁,性能也不错:
SELECT siparis_detay.[kodu] as [Urun_kodu], siparisler.[id] as [Siparis_No], [firmaadi], siparisler.[kodu] as Siparis_Kodu, siparisler.[tarih] as tarih1, siparisler.[eposta], uyelik.[haberdar], uyelik.[onay], siparisler.[uy_id] FROM siparis_detay INNER JOIN siparisler ON siparis_detay.sp_id = siparisler.id INNER JOIN urunler ON siparis_detay.kodu = urunler.kodu INNER JOIN uyelik ON siparisler.uy_id = uyelik.id WHERE siparisler.[durum] LIKE 'kargo%' AND siparis_detay.kodu='ac011' AND uyelik.[haberdar]=0 AND uyelik.[onay]=1 GROUP BY siparis_detay.[kodu], firmaadi, siparisler.[id], siparisler.[kodu], siparisler.[tarih], siparisler.[eposta], siparisler.[uy_id], uyelik.[haberdar], uyelik.[onay] ORDER BY siparisler.id DESC -- 跳过前100条,获取接下来的100条 OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY;
这个写法不需要嵌套子查询,直接在原查询末尾添加分页语句即可,非常直观。如果要切换分页,只需要修改OFFSET和FETCH NEXT后面的数字就行(比如第一页就是OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY)。
内容的提问来源于stack exchange,提问作者Melih Cavli
相关产品推荐
相关产品推荐

