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)
我认为应该是等价的,我需要一些测试数据.我只是不知道第一个版本是如何真正起作用的.
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)
我不能保证所有条件都完美。但这就是这个想法。