我正在研究一个SQL查询,其中包含几个连接,如下所示。
SELECT DISTINCT GL2.Number1, GL.DEPARTMENT,GL.CLASS,GL.SUBCLASS,GL.LINE, PR.*
FROM DETAIL A
LEFT JOIN CATEGORIES CAT ON A.WEB_ID=CAT.CATEGORY_ID
LEFT JOIN GROUP_LINES GL ON
A.BRAND=GL.MANUFACTURER
OR A.A1=GL.Number1
OR CAT.A2 = GL.DEPARTMENT
OR CAT.A3= GL.CLASS
OR CAT.A4= GL.SUBCLASS
OR CAT.A5= GL.LINE
LEFT JOIN RULE_GROUPS RG ON GL.GROUP_ID=RG.GROUP_ID
LEFT JOIN RULE_GROUPS RG2 ON RG.RULE_ID=RG2.RULE_ID
LEFT JOIN GROUP_LINES GL2 ON RG2.GROUP_ID=GL2.GROUP_ID
LEFT JOIN PRICING_RULES PR ON RG.RULE_ID=PR.RULE_ID
LEFT JOIN PRICING_ATTRIBUTES PA ON PR.RULE_ID=PA.RULE_ID
WHERE A.INVEN_ID='123456'
由于某些原因,我不认为上述查询是以最佳方式编写的。有没有办法可以更好地重写上述查询?
答案 0 :(得分:2)
我最初打算将此作为评论,但它太长了。
PR.*
可能会返回比您在结果集中实际需要的字段数更多的字段。根据表的大小,明确列出您需要的字段可能只是理论上的改进。
无论如何,如果这正是你想要的那样,我不会试图弄乱查询本身。即使你设法得到的东西能够以不同的方式返回完全相同的结果,但如果你看一下执行计划,它最终会完全相同,我也不会感到惊讶。
我建议您转而使用已知的良好查询,然后将其提供给Tuning Advisor,这将通过创建索引和统计信息等来确定如何使查询更快地运行。这是一个很棒的工具,有时结果几乎是神奇的。