在这里记录一下怕后面自己忘了, 直接看代码吧 ,这是我数据库需要查询的两张表
--库区表 select* from Reservoir
--仓库表 select * from Warehouse
需要的效果是将同一库区下的仓库的仓库名合并到同一字段中在进行查询,就是下图的效果
--将多个查询出的字段拼接到一个字段中 select c.ReservoirID,c.ReservoirName,c.ReservoirRemark, --在这里用到了Sql中的stuff函数 -- STUFF字符串函数是将字符串插入到另一个字符串中。 --它会删除开始位置第一个字符串中的指定长度的字符,然后将第二个字符串插入到开始位置的第一个字符串中 stuff( --这里查询是需要拼接的数据并在拼接是以","隔开 (select ','+WarehouseName from --从这个里面查询需要出拼接数据的来源并 (select r.ReservoirID,r.ReservoirName,w.WarehouseID, w.WarehouseName from Warehouse w,Reservoir r where w.ReservoirID=r.ReservoirID ) a where a.ReservoirID=c.ReservoirID --把得到的内容以XML的形式显示,并把把拼接的内容的第一个","去掉 for xml path('')),1,1,'') as WRNames --最后把以拼接的数据和其他数据一起查出来就是了 from (select w.WarehouseID,w.WarehouseName,w.ReservoirID,r.ReservoirName,r.ReservoirRemark from Warehouse w,Reservoir r where w.ReservoirID=r.ReservoirID) c group by c.ReservoirID,c.ReservoirName,c.ReservoirRemark
但是上面这个查法会出现,如果数据没有关联上时,没有关联的数据就会直接查不出来,然后我又把方法改了一下
select --将查出拼接的数据进行判断长度为0时 case when len( 这里时上面的方法里写的查询并凭借方法 (select stuff((select ','+WarehouseName from (select r.ReservoirID,r.ReservoirName,w.WarehouseID, w.WarehouseName from Warehouse w,Reservoir r where w.ReservoirID=r.ReservoirID ) a where a.ReservoirID=c.ReservoirID for xml path('')),1,1,'') as WRNames))=0 --为其赋一个默认值 then '该库区没有下属仓库' --将查出拼接的数据进行判断为空时, else isnull( --这里时上面的方法里写的查询并凭借方法 (select stuff( (select ','+WarehouseName from (select r.ReservoirID,r.ReservoirName,w.WarehouseID, w.WarehouseName from Warehouse w,Reservoir r where w.ReservoirID=r.ReservoirID ) as a where a.ReservoirID=c.ReservoirID for xml path('')),1,1,'') as WRNames), --条件成立时,赋默认值 '该库区没有下属仓库') --最后进行整体查询 end as WRNames,c.ReservoirID,c.ReservoirName,c.ReservoirRemark from (select * from Reservoir r ) as c group by c.ReservoirID,c.ReservoirName,c.ReservoirRemark
最后得到结果就是我需要的结果
此查询关键在于STUFF() 函数用于删除指定长度的字符,并可以在指定的起点处插入另一组字符,一般使用为:STUFF(字符串,从1开始计算字符开始位置,要删除的字符数,要重新插入的字符串)
STUFF('测试添加的',3,2,'修改')--测试修改的
标签:ReservoirID,--,ReservoirName,拼接,为空,Sql,默认值,where,select From: https://www.cnblogs.com/lwk9527/p/17374704.html