任何人都可以理解为什么这样做或如何正确使用这个SQL?

Cer*_*cme 5 sql t-sql sql-server

我已经更改了表名,但是我在SP中发现了这个FROM语句我正在优化,我想知道它是如何形成的,为什么你会做这样的事情,为什么它仍然有效.

FROM         tblPezFill pf 
RIGHT OUTER JOIN tblWolveLocation stfl 
RIGHT OUTER JOIN tblDuckPez pp 
RIGHT OUTER JOIN tblChaos o 
INNER JOIN tblBillLeg bi 
INNER JOIN @Facty selFac  
ON bi.WolveId = selFac.WolveId 
ON o.ChaosID = bi.ChaosId 
LEFT OUTER JOIN vwDonald stPres 
RIGHT OUTER JOIN tblStockChaos so 
            ON stPres.DonaldId = so.DonaldId 
            ON o.StockChaosID = so.StockChaosID 
            ON pp.PezID = o.PezID 
            ON stfl.WolveLocationId = so.WolveLocationId 
            ON pf.PezFillID = o.PezFillID 
LEFT OUTER JOIN tblCheeseburger p ON bi.CheeseburgerId = p.CheeseburgerId 
LEFT OUTER JOIN tblChaosCheeseburgerShipped ops ON o.ChaosID = ops.ChaosID 
LEFT OUTER JOIN vwDonald pres ON pp.DonaldId = pres.DonaldId 
LEFT OUTER JOIN tblDuck ON pp.DuckID = tblDuck.DuckId 
LEFT OUTER JOIN vwDuck ON pp.DuckID = vwDuck.DuckId 
LEFT OUTER JOIN tblWolveLocation fl ON pf.WolveLocationId = fl.WolveLocationId
Run Code Online (Sandbox Code Playgroud)

我把它清理干净了

FROM  tblBillLeg bi 
INNER JOIN @Facty  selFac ON bi.WolveId = selFac.WolveId 
LEFT OUTER JOIN tblCheeseburger p ON bi.CheeseburgerId = p.CheeseburgerId 
LEFT OUTER JOIN tblChaos o ON o.ChaosID = bi.ChaosId 
LEFT OUTER JOIN tblDuckPez pp ON pp.PezID = o.PezID 
LEFT OUTER JOIN tblPezFill pf ON pf.PezFillID = o.PezFillID
LEFT OUTER JOIN tblChaosCheeseburgerShipped ops ON o.ChaosID = ops.ChaosID 
LEFT OUTER JOIN tblStockChaos so ON o.StockChaosID = so.StockChaosID 
LEFT OUTER JOIN tblWolveLocation stfl ON stfl.WolveLocationId = so.WolveLocationId 
LEFT OUTER JOIN vwDonald stPres ON stPres.DonaldId = so.DonaldId 
LEFT OUTER JOIN vwDonald pres ON pp.DonaldId = pres.DonaldId 
LEFT OUTER JOIN tblDuck ON pp.DuckID = tblDuck.DuckId 
LEFT OUTER JOIN vwDuck ON pp.DuckID = vwDuck.DuckId 
LEFT OUTER JOIN tblWolveLocation fl ON pf.WolveLocationId = fl.WolveLocationId
Run Code Online (Sandbox Code Playgroud)

我认为应该是等价的,我需要一些测试数据.我只是不知道第一个版本是如何真正起作用的.

Bil*_*win 2

SQL 中的连接表达式是构造性的,就像算术表达式一样。

也就是说,您可以执行以下操作:

A JOIN B ON <expr-AB>
Run Code Online (Sandbox Code Playgroud)

但您也可以用另一个连接表达式替换 B:

A JOIN (B JOIN C ON <expr-BC>) ON <expr-AB>
Run Code Online (Sandbox Code Playgroud)

如果优先级的自然顺序会给出相同的结果,则括号可能是多余的:

A JOIN B JOIN C ON <expr-BC> ON <expr-AB>
Run Code Online (Sandbox Code Playgroud)

因此,您显示的巨大的模糊查询是合法的语法,但它肯定可以更清晰。


我将查询视为如下层次结构:

so
so --left--> stfl
so --left--> stPres
so --left--> o
             o --inner-> bi
                         bi --inner-> selFac
                         bi --left--> p
             o --left--> pp
                         pp --left--> pres
                         pp --left--> tblDuck
                         pp --left--> vwDuck
             o --left--> pf
                         pf --left--> fl
             o --left--> ops
Run Code Online (Sandbox Code Playgroud)

我会像这样重写查询:

FROM tblStockChaos so 
LEFT OUTER JOIN tblWolveLocation stfl
  ON so.WolveLocationId = stfl.WolveLocationId 
LEFT OUTER JOIN vwDonald stPres
  ON so.DonaldId = stPres.DonaldId 
LEFT OUTER JOIN
  (tblChaos o 
   INNER JOIN
     (tblBillLeg bi
      INNER JOIN @Facty selFac
        ON bi.WolveId = selFac.WolveId
      LEFT OUTER JOIN tblCheeseburger p
        ON bi.CheeseburgerId = p.CheeseburgerId)
     ON o.ChaosID = bi.ChaosId 
   LEFT OUTER JOIN
     (tblDuckPez pp 
      LEFT OUTER JOIN vwDonald pres
        ON pp.DonaldId = pres.DonaldId 
      LEFT OUTER JOIN tblDuck
        ON pp.DuckID = tblDuck.DuckId 
      LEFT OUTER JOIN vwDuck
        ON pp.DuckID = vwDuck.DuckId)
     ON o.PezID = pp.PezID
   LEFT OUTER JOIN tblPezFill 
     (tblPezFill pf
      LEFT OUTER JOIN tblWolveLocation fl
        ON pf.WolveLocationId = fl.WolveLocationId)
     ON o.PezFillID = pf.PezFillID
   LEFT OUTER JOIN tblChaosCheeseburgerShipped ops 
     ON o.ChaosID = ops.ChaosID
  )
Run Code Online (Sandbox Code Playgroud)

我不能保证所有条件都完美。但这就是这个想法。