sql 子查询联查

时间:2022-09-17 22:32:56

话不多说,直接上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在创作过程中,我已感觉到生无可恋

做个简介:上面两个子查询是拼接字段:

sql 子查询联查

这个难点在 FOR XML PATH 上 它是一个类似 mysql的  group_concat   都是用来拼接单独字段的,但是sql server 这个拼接选择样式多一点,它可以以任何特殊字符、数字、字母拼接:

sql 子查询联查这个单引号里放什么拼接出来的就是什么;至于FOR XML PATH ('') 这个单引号,我个人认为它是一种规定格式不可改变。

最后一个子查询是一个顶梁柱(因为前两个子查询都需要它的辅助,或许大家看不出来,我做个标识);

sql 子查询联查

总结一下:查询(SELECT * FROM) 是先执行from后面的内容,所以我上面可以使用最后一个子查询的别名来.出来值,因为前面两个执行的时候,from 后面是已经执行完毕。


用心记录一点点。内容也许不重要,但习惯很重要!

--------更新-------

欢迎大家评论,互相学习