内部加入长查询?

时间:2016-11-08 12:39:18

标签: sql sql-server tsql

我刚刚登陆这个新工作,并且有一个报告,我要求显示存储在另一个表中的信息,所以我需要增强由离开公司的人开发的现有查询。

查询相当长,我没有到达应该插入INNER JOIN子句的位置,该子句将检索我需要的信息。

这是原始代码:

    SELECT ToolLists.Ident,
       ToolLists.Descript AS TLDescript,
       ToolLists.MaterialNr,
       ToolLists.Order,
       ToolLists.Who,
       ToolLists.NCP,
       ToolLists.Rem AS TLRem,
       ToolLists.MDate,
       ToolLists.TDate,
       ToolLists.GDate,
       ToolList.T,
       Machines.Name AS MachineName,
       Machines.TRelation,
       ToolList.D,
       ToolList.H,
       ToolList.Pos AS ToolListPos,
       ToolList.Rem AS ToolListRem,
       ToolList.How AS ToolListHow,
       Tools.Nr,
       Tools.Z1,
       Tools.Drawing,
       Tools.X1,
       Tools.Sort,
       Tools.Design,
       Tools.Descript,
       Tools.Rem AS ToolRem,
       ToolParts.Pos AS ToolPartPos,
       ToolParts.Nbr,
       ToolParts.How,
       Parts.UNr,
       Parts.MID,
       Parts.Descript,
       Parts.Sort,
       Parts.Design,
       Parts.URem,
       Parts.DMC,
       Parts.CLength,
       Parts.CMainArc,
       Parts.CRadius,
       Parts.UActiv,
       MatClasses.DMC,
       MatClasses.Description,
       MatClasses.Quality,
       NoteToolLists.NoteText
FROM Parts
INNER JOIN ( (Machines
              RIGHT JOIN ( (MatClasses
                            RIGHT JOIN (NoteToollists
                                        RIGHT JOIN (Materials
                                                    RIGHT JOIN ([SELECT ID, Param1 FROM WTDIDList WHERE WTGUID = '4a9b5a05-fa43-48d1-af2f-342ea407f4e2']. AS IDList
                                                                INNER JOIN ToolLists ON IDList.ID = ToolLists.Nr) ON Materials.Nr = ToolLists.MaterialNr) ON NoteToolLists.Nr = ToolLists.Nr) ON MatClasses.Nr = Materials.MatClassNr)
                          INNER JOIN (Tools
                                      INNER JOIN ToolList ON Tools.Nr = ToolList.ToolNr) ON ToolLists.Nr = ToolList.ToolListNr) ON Machines.Nr = ToolLists.MachineNr)
            INNER JOIN ToolParts ON Tools.Nr = ToolParts.ToolNr) ON Parts.ID = ToolParts.PartID
ORDER BY ToolLists.Nr,
         ToolList.Pos,
         ToolList.T;

有一个名为SiteParts的表,其中包含一个名为Place的列 - 我需要检索此列中的值,其中列PartId的值等于列{{表ID

中的1}}

所以我尝试将其添加到上面的代码中:

Parts

所以这是我的尝试:

INNER JOIN (SELECT Place FROM SiteParts) ON SiteParts.PartId = Parts.ID

但服务器拒绝我的查询,并显示以下消息:

 SELECT ToolLists.Ident,
           ToolLists.Descript AS TLDescript,
           ToolLists.MaterialNr,
           ToolLists.Order,
           ToolLists.Who,
           ToolLists.NCP,
           ToolLists.Rem AS TLRem,
           ToolLists.MDate,
           ToolLists.TDate,
           ToolLists.GDate,
           ToolList.T,
           Machines.Name AS MachineName,
           Machines.TRelation,
           ToolList.D,
           ToolList.H,
           ToolList.Pos AS ToolListPos,
           ToolList.Rem AS ToolListRem,
           ToolList.How AS ToolListHow,
           Tools.Nr,
           Tools.Z1,
           Tools.Drawing,
           Tools.X1,
           Tools.Sort,
           Tools.Design,
           Tools.Descript,
           Tools.Rem AS ToolRem,
           ToolParts.Pos AS ToolPartPos,
           ToolParts.Nbr,
           ToolParts.How,
           Parts.UNr,
           Parts.MID,
           Parts.Descript,
           Parts.Sort,
           Parts.Design,
           Parts.URem,
           Parts.DMC,
           Parts.CLength,
           Parts.CMainArc,
           Parts.CRadius,
           Parts.UActiv,
           MatClasses.DMC,
           MatClasses.Description,
           MatClasses.Quality,
           NoteToolLists.NoteText,
           SiteParts.Place
    FROM Parts
    INNER JOIN ( (Machines
                  RIGHT JOIN ( (MatClasses
                                RIGHT JOIN (NoteToollists
                                            RIGHT JOIN (Materials
                                                        RIGHT JOIN ([SELECT ID, Param1 FROM WTDIDList WHERE WTGUID = '4a9b5a05-fa43-48d1-af2f-342ea407f4e2']. AS IDList
                                                                    INNER JOIN ToolLists ON IDList.ID = ToolLists.Nr)
                                                        INNER JOIN
                                                          (SELECT Place
                                                           FROM SiteParts)) ON Materials.Nr = ToolLists.MaterialNr) ON NoteToolLists.Nr = ToolLists.Nr) ON MatClasses.Nr = Materials.MatClassNr)
                  INNER JOIN (Tools
                              INNER JOIN ToolList ON Tools.Nr = ToolList.ToolNr) ON ToolLists.Nr = ToolList.ToolListNr) ON Machines.Nr = ToolLists.MachineNr)
    INNER JOIN ToolParts ON Tools.Nr = ToolParts.ToolNr) ON Parts.ID = ToolParts.PartID ON PartId = Parts.Id
    ORDER BY ToolLists.Nr,
             ToolList.Pos,
             ToolList.T;

我已经重复了很多次,但我无法正确处理这个长查询。有人能指出我做错了吗?

很明显我不像前一个人那样擅长SQL,但是我需要赶上并尝试使用当前代码来处理它而不是重新编写它只是因为我不知道如何他做到了。

2 个答案:

答案 0 :(得分:1)

即使查询非常复杂并且可以使用一些重写,但答案应该非常简单。

将此添加到/^(my|the) name is (\w+)$/ => 4 words - 部分:

SELECT

...正如您在尝试中所做的那样(此条目与上一个/下一个条目之间使用逗号)。

然后将其添加到SiteParts.Place - 行上方的新行中:

ORDER BY

应该这样做。

答案 1 :(得分:0)

此代码有效 - 必须重写一下,但现在可以正常工作:

    SELECT ToolLists.Ident,
       ToolLists.Descript AS TLDescript,
       ToolLists.MaterialNr,
       ToolLists.Order,
       ToolLists.Who,
       ToolLists.NCP,
       ToolLists.Rem AS TLRem,
       ToolLists.MDate,
       ToolLists.TDate,
       ToolLists.GDate,
       ToolList.T,
       Machines.Name AS MachineName,
       Machines.TRelation,
       ToolList.D,
       ToolList.H,
       ToolList.Pos AS ToolListPos,
       ToolList.Rem AS ToolListRem,
       ToolList.How AS ToolListHow,
       Tools.Nr,
       Tools.Z1,
       Tools.Drawing,
       Tools.X1,
       Tools.Sort,
       Tools.Design,
       Tools.Descript,
       Tools.Rem AS ToolRem,
       ToolParts.Pos AS ToolPartPos,
       ToolParts.Nbr,
       ToolParts.How,
       Parts.UNr,
       Parts.MID,
       Parts.Descript,
       Parts.Sort,
       Parts.Design,
       Parts.URem,
       Parts.DMC,
       Parts.CLength,
       Parts.CMainArc,
       Parts.CRadius,
       Parts.UActiv,
       MatClasses.DMC,
       MatClasses.Description,
       MatClasses.Quality
FROM (Parts
      RIGHT JOIN ((Machines
                   RIGHT JOIN ((MatClasses
                                RIGHT JOIN (Materials
                                            RIGHT JOIN (
                                                          (SELECT ID,
                                                                  Param1
                                                           FROM WTDIDList
                                                           WHERE WTGUID = '0e2c2ffe-6c09-4866-a114-5c0e2fe6260c' ) AS IDList
                                                        INNER JOIN ToolLists ON IDList.ID = ToolLists.Nr) ON Materials.Nr = ToolLists.MaterialNr) ON MatClasses.Nr = Materials.MatClassNr)
                               INNER JOIN (Tools
                                           INNER JOIN ToolList ON Tools.Nr = ToolList.ToolNr) ON ToolLists.Nr = ToolList.ToolListNr) ON Machines.Nr = ToolLists.MachineNr)
                  INNER JOIN ToolParts ON Tools.Nr = ToolParts.ToolNr) ON Parts.ID = ToolParts.PartID)
LEFT JOIN
  (SELECT PartId,
          Place
   FROM SiteParts
   WHERE SiteNr = 1) AS SP ON SP.PartId = Parts.Id
ORDER BY ToolLists.Nr,
         ToolList.Pos,
         ToolList.T;

在查询结束时作为LEFT JOIN的解决方案。

感谢各位和大家的有益帮助!