考虑以下问题:
SELECT
*
FROM Employees E
JOIN States S ON E.idEmployee = S.idEmployee
LEFT JOIN Data1 D1 ON S.data1 = D1.data1
LEFT JOIN Data2 D2 ON S.data2 = D2.data2
LEFT JOIN Data3 D3 ON S.data3 = D3.data3
WHERE (S.idStateType = 1 and D1.attribute1 = value)
OR (S.idStateType = 2 and D2.attribute2 = value and D2.attribute3 = value)
OR (S.idStateType = 3 and (D1.attribute1 = value or D3.attribute3 = value))
第二个连接(表Data2)仅在S.idStateType = 2时有效,如果idStateType为<>,则该连接将变得不可用。 2。
如果我将连接条件更改为依赖于idStateType,那么它是否重要(从优化的角度来看,还是设计视图)?
它会变成:
LEFT JOIN data2 DT ON S.idStateType = 2 AND S.data2 = D2.data2
答案 0 :(得分:0)
在大多数情况下,您的查询应该没问题。 SQL是一种解释型语言,因此它不一定按照您编写的顺序运行,而是根据它认为结果的样子运行它认为最有效的顺序。如果您想真正测试您的结果切换"包括实际执行计划"在" SQL编辑器" SSMS中的栏并以不同的方式运行查询以查看最有效的方法。
您可以像这样重写您的查询:
SELECT
*
FROM Employees E
JOIN States S ON E.idEmployee = S.idEmployee
LEFT JOIN Data1 D1 ON S.data1 = D1.data1 AND S.idStateType = 1
AND D1.attribute1 = value
LEFT JOIN Data2 D2 ON S.data2 = D2.data2 AND S.idStateType = 2
and D2.attribute2 = value and D2.attribute3 = value
LEFT JOIN Data3 D3 ON S.data3 = D3.data3 AND S.idStateType = 3
and (D1.attribute1 = value or D3.attribute3 = value)
执行此操作可能会加快查询速度,但实际的解释器将根据表结构和索引编制最终结果。使用执行计划可以帮助确定解释器如何运行此查询,并有助于找到最佳的优化方法。