话不多说,直接上sql,下面详解:
特作说明,此sql是sql server数据库,望晓知:
SELECT sb.*,
(SELECT TOP 3 wd.ImageUrl+','FROM dbo.zab_shiGong sg
LEFT JOIN dbo.D_WorksInfo wdi ON wdi.OrderNo=sg.sg_rwdid
LEFT JOIN dbo.D_WorksDetaiInfo wd ON wd.WorksID=wdi.WorksID WHERE sg.sg_rwdid=sb.ci_RwdId FOR XML path('')) AS xiaoguo,
( SELECT TOP 3 a.ImgUrl+',' FROM [WENES].dbo.WEN_ImgAssociatedInfo a
LEFT JOIN [WENES].dbo.WEN_ProjectInfo b ON a.ProjectId = b.ProjectId
LEFT JOIN dbo.zab_shiGong sg ON sg.sg_rwdid=b.RwdId WHERE b.IsDel != 1
AND a.ImgType IN (12,22) AND sg.sg_rwdid=sb.ci_RwdId FOR xml path('')) AS jungong
FROM
(select sg.sg_gcmc,cl.ci_Area,bg.bg_TotalPrice,cay.ca_proAttribute,cay.ca_HousingType,cl.ci_RwdId,dq.DiquName,bg.bg_guid
FROM dbo.zab_shiGong sg
LEFT JOIN dbo.ZAB_BudgetInfo bg ON sg.sg_BudgetId=bg.bg_guid
LEFT JOIN dbo.zab_clientInfo cl ON sg.sg_rwdid=cl.ci_RwdId
LEFT JOIN dbo.zab_clientAuxiliary cay ON cay.ci_rwdid=sg.sg_rwdid
LEFT JOIN dbo.zab_LeiXing lx ON cl.ci_Type=lx.ID
LEFT JOIN dbo.E_DiquInfo dq ON cl.tb_diqu=dq.DiquID
WHERE sg.sg_ContractStatus IN (6,8) AND bg_guid IS NOT NULL ) sb
原谅我使用“sb”做别名,因为这个sql在创作过程中,我已感觉到生无可恋。
做个简介:上面两个子查询是拼接字段:
这个难点在 FOR XML PATH 上 它是一个类似 mysql的 group_concat 都是用来拼接单独字段的,但是sql server 这个拼接选择样式多一点,它可以以任何特殊字符、数字、字母拼接:
这个单引号里放什么拼接出来的就是什么;至于FOR XML PATH ('') 这个单引号,我个人认为它是一种规定格式不可改变。
最后一个子查询是一个顶梁柱(因为前两个子查询都需要它的辅助,或许大家看不出来,我做个标识);
总结一下:查询(SELECT * FROM) 是先执行from后面的内容,所以我上面可以使用最后一个子查询的别名来.出来值,因为前面两个执行的时候,from 后面是已经执行完毕。
用心记录一点点。内容也许不重要,但习惯很重要!
--------更新-------
欢迎大家评论,互相学习