首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 很长的一条语句,看你看不看得懂 [已结贴,结贴人:zero8500]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 15:26:06 楼主
    select a.*,c.serial8

    from SD_Deliveries a, (select distinct b.docno,b.serial8 from mm_movingdetails b
                                                        where b.doctype = 'MDV'
                                                          and isnull(b.serial8,'') = isnull(?,isnull(b.serial8,''))
                                              ) c 
    where a.CompanyID = isnull(?,a.CompanyID)
      and a.DocType = isnull(?,a.DocType)
      and a.DocNo = isnull(?,a.DocNo)
      and a.DlvrType = isnull(?,a.DlvrType)
      and isnull(a.CustID,'') = isnull(?,isnull(a.CustID,''))
      and isnull(a.MatGrp,'') in (
                                    select isnull(DomainID,isnull(a.MatGrp,''))
                                            from usr_domainrights(?,'MM',?,?)
                                )
      and isnull(a.MatNo,'') = isnull(?,isnull(a.MatNo,''))
      and isnull(a.MatPrpty,'') = isnull(?,isnull(a.MatPrpty,''))
      and isnull(a.OrderNo,'') = isnull(?,isnull(a.OrderNo,''))
      and isnull(a.DlvrDate,'') >= isnull(?,isnull(a.DlvrDate,''))
      and isnull(a.DlvrDate,'') <= isnull(?,isnull(a.DlvrDate,''))
      and isnull(a.AuditStatus,2147483647)&isnull(?,2147483647)>=1
      and isnull(a.DlvrStatus,2147483647)&isnull(?,2147483647)>=1     
      and isnull(a.SDEmp,'') = isnull(?,isnull(a.SDEmp,''))     
      and isnull(a.SDOrg,'') in (
                                    select isnull(DomainID,isnull(a.SDOrg,'')) from usr_domainrights(?,'SD',?,?)
                                ) 
      and isnull(a.MatSpec,'') like '%'+isnull(?,'')+'%' 
      and a.docno = c.docno
      order by case ?  when 'DocNo' then a.DocNo
                      when 'OrderNo' then a.OrderNo
                      when 'CustID' then a.CustID
                      when 'MatNo' then a.MatNo+isnull(a.MatSpec,''+'')
                      when 'ExpireDate' then a.ExpireDate
                      when 'SDEmp' then a.SDEmp
                      when 'Serial8' then c.Serial8
                      else a.DocNo
                end desc

    这条语句主要做什么用呢?好长哦。没看明白
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 15:27:281楼 得分:1
    看不懂.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 15:31:532楼 得分:3
    SQL code
    --从这两个表中取出值, D_Deliveries (select distinct b.docno,b.serial8 from mm_movingdetails b where b.doctype = 'MDV' and isnull(b.serial8,'') = isnull(?,isnull(b.serial8,''))



    按照这些条件过滤
    SQL code
    where a.CompanyID = isnull(?,a.CompanyID) and a.DocType = isnull(?,a.DocType) and a.DocNo = isnull(?,a.DocNo) and a.DlvrType = isnull(?,a.DlvrType) and isnull(a.CustID,'') = isnull(?,isnull(a.CustID,'')) and isnull(a.MatGrp,'') in ( select isnull(DomainID,isnull(a.MatGrp,'')) from usr_domainrights(?,'MM',?,?) ) and isnull(a.MatNo,'') = isnull(?,isnull(a.MatNo,'')) and isnull(a.MatPrpty,'') = isnull(?,isnull(a.MatPrpty,'')) and isnull(a.OrderNo,'') = isnull(?,isnull(a.OrderNo,'')) and isnull(a.DlvrDate,'') >= isnull(?,isnull(a.DlvrDate,'')) and isnull(a.DlvrDate,'') <= isnull(?,isnull(a.DlvrDate,'')) and isnull(a.AuditStatus,2147483647)&isnull(?,2147483647)>=1 and isnull(a.DlvrStatus,2147483647)&isnull(?,2147483647)>=1 and isnull(a.SDEmp,'') = isnull(?,isnull(a.SDEmp,'')) and isnull(a.SDOrg,'') in ( select isnull(DomainID,isnull(a.SDOrg,'')) from usr_domainrights(?,'SD',?,?) ) and isnull(a.MatSpec,'') like '%'+isnull(?,'')+'%' and a.docno = c.docno


    按照这些条件排序
    SQL code
    order by case ? when 'DocNo' then a.DocNo when 'OrderNo' then a.OrderNo when 'CustID' then a.CustID when 'MatNo' then a.MatNo+isnull(a.MatSpec,''+'') when 'ExpireDate' then a.ExpireDate when 'SDEmp' then a.SDEmp when 'Serial8' then c.Serial8 else a.DocNo end desc


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 15:33:473楼 得分:1
    条件多些,有个复杂的排序,有个子查询
    不复杂

    问题是  isnull(?, 不知道是什么用法
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 15:39:024楼 得分:0
    引用 3 楼 Haiwer 的回复:
    条件多些,有个复杂的排序,有个子查询
    不复杂

    问题是  isnull(?, 不知道是什么用法

    同样奇怪为啥有个'?'在那里,
    貌似偶没有见过这样的用法,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 15:40:405楼 得分:1
    可能是考试题目,?是要填的字段名
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 16:16:566楼 得分:0
    不是考试题目,就是项目中的一个查询。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 21:48:537楼 得分:1
    SQL code
    isnull(?,a.CompanyID)


    问号什么用,没有看懂..
    order by case ?  when 'DocNo' then a.DocNo
                      when 'OrderNo' then a.OrderNo
                      when 'CustID' then a.CustID
                      when 'MatNo' then a.MatNo+isnull(a.MatSpec,''+'')
                      when 'ExpireDate' then a.ExpireDate
                      when 'SDEmp' then a.SDEmp
                      when 'Serial8' then c.Serial8
                      else a.DocNo
                end desc

    ?号什么用?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 21:56:578楼 得分:1
    其它数据库转过来的吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-05 10:07:529楼 得分:5
    我上一个更复杂的吧, 为自己工厂ERP写的一个采购多项查询视图,基于用友U870的数据库架构,原来用以就是这么烂,我发誓,以后再也不会上用友的系统了
    SQL code
    IF EXISTS(SELECT name FROM sysobjects WHERE name=N'PU_PO_ArrivalArriveDate' AND xtype='V') DROP VIEW PU_PO_Arrival_Rd GO CREATE VIEW PU_PO_ArrivalArriveDate AS SELECT POID, --请购采购交期对照表 2008-06-25 cPOID, iAppIds, ID, dPODate, POcBusType, POcVenCode, cVenAbbName, POcPersonCode, POcMaker, POcCloser, POcInvCode AS Part, cInvName, cInvStd, POiQuantity, dArriveDate, AppsID, PUAutoID, PUcCode, PUdDate, PUcBusType, AppcInvCode, PUfQuantity, PUdReQuirDate, PUiReceivedQTY, ArrivaliPOsID, ArrivalcInvCode, MinArrivaldDate, ArrivalQTY , CASE WHEN PUdReQuirDate>'2006-01-01' AND dArriveDate >'2006-01-01' AND DATEDIFF(DAY,PUdReQuirDate,dArriveDate)>0 THEN '延期采购' WHEN PUdReQuirDate BETWEEN '2006-01-01' AND GETDATE() AND dArriveDate < '2006-01-01' THEN '延期采购' WHEN PUdReQuirDate>'2006-01-01' AND dArriveDate >'2006-01-01' AND DATEDIFF(DAY,PUdReQuirDate,dArriveDate)=0 THEN '实时采购' WHEN PUdReQuirDate>'2006-01-01' AND dArriveDate >'2006-01-01' AND DATEDIFF(DAY,PUdReQuirDate,dArriveDate)<0 THEN '提前采购' ELSE '不明确' END AS POStatus, CASE WHEN (MinArrivaldDate <dArriveDate AND DAY(dArriveDate)<27) THEN '先行交货' WHEN (MinArrivaldDate =dArriveDate AND DAY(dArriveDate)<27) OR DAY(dArriveDate)>=27 THEN '正常交货' WHEN MinArrivaldDate > dArriveDate AND DAY(dArriveDate)<27 THEN '延期交货' WHEN MinArrivaldDate IS NULL AND DAY(dArriveDate)<27 THEN '物料未归' ELSE '不明确' END AS ArriStatus FROM (SELECT PO_POMain.POID, --采购单 --查有已做采购单的请购单 PO_POMain.cPOID, PO_PODetails.iAppIds, PO_PODetails.ID, PO_POMain.dPODate, PO_POMain.cBusType AS POcBusType, PO_POMain.cVenCode AS POcVenCode, Vendor.cVenAbbName, PO_POMain.cPersonCode AS POcPersonCode, PO_POMain.cMaker AS POcMaker, PO_POMain.cCloser AS POcCloser,PO_PODetails.cInvCode AS POcInvCode,Inventory.cInvName, Inventory.cInvStd, PO_PODetails.iQuantity AS POiQuantity, PO_PODetails.dArriveDate, PU_AppVouch.ID AS AppsID, --请购单 PU_AppVouchs.AutoID AS PUAutoID, PU_AppVouch.cCode AS PUcCode, PU_AppVouch.dDate AS PUdDate, PU_AppVouch.cBusType AS PUcBusType, PU_AppVouchs.cInvCode AS AppcInvCode, PU_AppVouchs.fQuantity AS PUfQuantity, PU_AppVouchs.dRequirDate AS PUdReQuirDate, PU_AppVouchs.iReceivedQTY AS PUiReceivedQTY FROM PO_POMain, PO_PODetails,PU_AppVouch, PU_AppVouchs,Inventory,Vendor WHERE PO_POMain.POID = PO_PODetails.POID AND PU_AppVouchs.ID = PU_AppVouch.ID + 0 AND PO_PODetails.cInvCode=Inventory.cInvCode AND PO_POMain.cVenCode=Vendor.cVenCode AND PO_POMain.dPODate >= '2007-01-01' AND PO_PODetails.iAppIds = PU_AppVouchs.AutoID UNION SELECT 0 AS POID, --采购单 --查所有未下采购单的请购单 '' AS cPOID, 0 AS iAppIds, 0 AS ID, '1900-01-01' AS dPODate, '' AS POcBusType, '' AS POcVenCode, '' AS cVenAbbName, '' AS POcPersonCode, '' AS POcMaker, '' AS POcCloser, PU_AppVouchs.cInvCode AS POcInvCode, Inventory.cInvName, Inventory.cInvStd, 0 AS POiQuantity, '1900-01-01' AS dArriveDate,PU_AppVouch.ID AS AppsID, --请购单 PU_AppVouchs.AutoID AS PUAutoID, PU_AppVouch.cCode AS PUcCode, PU_AppVouch.dDate AS PUdDate, PU_AppVouch.cBusType AS PUcBusType, PU_AppVouchs.cInvCode AS AppcInvCode, PU_AppVouchs.fQuantity AS PUfQuantity, PU_AppVouchs.dRequirDate AS PUdReQuirDate, PU_AppVouchs.iReceivedQTY AS PUiReceivedQTY FROM PU_AppVouch,PU_AppVouchs,Inventory WHERE PU_AppVouchs.ID = PU_AppVouch.ID+0 AND PU_AppVouchs.cInvCode=Inventory.cInvCode AND PU_AppVouchs.iReceivedQTY=0 UNION SELECT PO_POMain.POID, --采购单 --查所有直接采购 PO_POMain.cPOID, PO_PODetails.iAppIds, PO_PODetails.ID, PO_POMain.dPODate, PO_POMain.cBusType AS POcBusType, PO_POMain.cVenCode AS POcVenCode, Vendor.cVenAbbName,PO_POMain.cPersonCode AS POcPersonCode, PO_POMain.cMaker AS POcMaker, PO_POMain.cCloser AS POcCloser, PO_PODetails.cInvCode AS POcInvCode, Inventory.cInvName, Inventory.cInvStd,PO_PODetails.iQuantity AS POiQuantity, PO_PODetails.dArriveDate,0 AS AppsID, --请购单 0 AS PUAutoID, '' AS PUcCode, '1900-01-01' AS PUdDate, '' AS PUcBusType, '' AS AppcInvCode, 0 AS PUfQuantity, '1900-01-01' AS PUdReQuirDate, 0 AS PUiReceivedQTY FROM PO_POMain, PO_PODetails, Inventory,Vendor WHERE PO_POMain.POID = PO_PODetails.POID AND PO_POMain.cBusType='普通采购' AND PO_PODetails.cInvCode=Inventory.cInvCode AND PO_POMain.cVenCode=Vendor.cVenCode AND PO_POMain.dPODate >= '2007-01-01'AND PO_PODetails.cSource IS NULL) A LEFT OUTER JOIN(SELECT PU_ArrivalVouchs.iPOsID AS ArrivaliPOsID, --查到货单情况,第一次到货日期 PU_ArrivalVouchs.cInvCode AS ArrivalcInvCode, MIN(PU_ArrivalVouch.dDate) AS MinArrivaldDate, SUM(iQuantity) AS ArrivalQTY FROM PU_ArrivalVouch, PU_ArrivalVouchs WHERE PU_ArrivalVouch.ID = PU_ArrivalVouchs.ID AND PU_ArrivalVouchs.iQuantity > 0 ---因为到货单的日期一定大于退货单和据收单, GROUP BY PU_ArrivalVouchs.iPOsID, PU_ArrivalVouchs.cInvCode) AS Arrival ON A.ID = Arrival.ArrivaliPOsID AND A.POcInvCode = Arrival.ArrivalcInvCode
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-05 13:07:1610楼 得分:0
    长,不代表复杂!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-05 17:28:1411楼 得分:1
    引用 10 楼 pt1314917 的回复:
    长,不代表复杂!



    我放我的语句上去是希望你们学习一下我的语法.
    这个嘛,我从来不看那那些不区分关键词的SQL语句的,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hackztx
    • 等级:
    发表于:2008-07-05 17:34:2512楼 得分:1
    不是很复杂。。无非就是联合语言加一些基本的函数而已顺便where和orderby
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-05 17:43:1713楼 得分:1
    本就复杂.我只是从我数据库里随便调了一个语句出来.我没有说复杂,我只是说用友的数据库结构不厚道.
    一个采购多项查询都要写这么长语句,作为一个ERP软件,其数据表那么多.就不厚道了.
    而且用友根本不提供一些基本的查询.有的就是单据列表,要做一下数据分析都不行,完全就是个记账软件.我用的是U870
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-05 19:51:2914楼 得分:0
    不是吧.用友这么不厚道!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-06 00:01:5015楼 得分:0
    have to mark.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-06 00:11:3516楼 得分:0
    isnull(?, 不知道是什么用法
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-06 01:31:0817楼 得分:0
    学习```````
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • thncn
    • 等级:
    发表于:2008-07-06 09:05:2918楼 得分:1
    长是不代表复杂,同意。我觉得看起来比较复杂的是括号很多的多级查询,有时自己写一个过两天看不明了。

    LZ的语句结构简单明了,就是看不明用那么多isnull做什么?还那么多的“?”
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-06 09:06:4619楼 得分:1
    晕,这么长,我觉得你还是要静下心来,一步一步看,

    就象10楼说的,长,不代表复杂!

    相信你能看懂
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-07 16:31:1420楼 得分:0
    #region  测试数据
    // public DataTable DoTest()
    // {
    // string strSql = @"select distinct table1.*,table2.locationtype_name,table3.family_name,table4.listofcertificates_name,table5.company_name from
    // (select distinct a.gl_id,c.city_latitude as c.city_x,c.city_longitude as city_y,a.gl_name,
    // a.gl_mfgprocode,a.gl_code,a.gl_share,a.gl_partnername,
    // a.gl_actualizationdate,a.gl_street,a.gl_state,a.gl_zip,a.gl_tel,
    // a.gl_fax,a.accessmap,c.city_name,o1.emp_cname
    // as director,o2.emp_cname
    // as commchampion,o3.emp_cname as toolschampion,p.direct_headcount,
    // p.indirect_headcount,p.buildingsfootpring,p.area_used,p.potential_extension,
    // p.rdpart,p.sgapart,p.plantlayout_path,p.plant_owned,p.plant_rented,d.locationtype_path,
    // case when c.rgn_id='13EF2FF3-A964-406D-AA33-99ADD4860B31' then 'usa'
    // when c.rgn_id='155F3A33-3071-4AB3-BE2E-CFECDADE9E2B' then 'latin'
    // when c.rgn_id='B394E465-6E81-4935-A5A0-DE66939714E3' then 'cis'
    // when c.rgn_id='E9750119-6EC2-4A99-99BF-5AC05132F7B7' then 'asia'
    // end as city_region from Inn_GemaltoLocations a
    // left join Inn_GL_ADType b on a.GL_ID=b.GL_ID
    // left join inn_city c on a.GL_City_ID = c.City_ID
    // left join inn_country d on c.country_id=d.country_id
    // left join inn_region e on d.rgn_id=e.rgn_id
    // left join oc_employee o1 on a.Director_ID = o1.emp_id
    // left join oc_employee o2 on a.CommChampion_id = o2.emp_id
    // left join oc_employee o3 on a.ToolsChampion_id = o3.emp_id
    // left join Inn_Industrial_PlantLayout p on a.GL_ID=p.GL_ID
    // ,Inn_locationType d where b.GL_LocationType_ID=d.locationType_id and d.locationType_id='dcf200dd-f29f-4239-af4e-c358f490893e') as table1
    // left join
    // (select distinct a.gl_id,b.locationtype_name from Inn_GL_ADType a left join Inn_locationType b on a.GL_LocationType_ID=b.locationType_id) table2 on table1.gl_id=table2.gl_id left join
    // (select distinct a.gl_id,b.family_name from Inn_GL_ProductsQM a left join Inn_ProductsFamilies b on a.Family_id=b.Family_ID) table3 on table1.gl_id=table3.gl_id left join
    // (select distinct a.gl_id,b.listofcertificates_name from Inn_SM_SitesCertifications a left join Inn_GL_ListOfCertificates b on a.listOfCertificates_id=b.listOfCertificates_id) table4 on table1.gl_id=table4.gl_id left join
    // (select distinct a.gl_id,b.company_name from Inn_GL_MajorCustomers a left join Inn_Industrial_Company b on a.Company_ID=b.Company_ID) table5 on table1.gl_id=table5.gl_id";
    // JueKit.Collections.OleDbParameterCollection pc = new JueKit.Collections.OleDbParameterCollection();
    // DataSet ds = new DataSet();
    //
    // DataTable dt_location = JueKit.Data.DataAccess.ExecuteDatatable(strSql,pc);
    // dt_location.TableName = "dt_searchresult";
    // return dt_location;
    // }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-07 16:32:5121楼 得分:0