SQL 2000中的多个内部联接

时间:2009-08-26 10:10:23

标签: sql sql-server-2005 sql-server-2000 inner-join

我处于开发环境中使用SQL Server 2005但在生产服务器上使用SQL Server 2000开发应用程序的不幸情况。我有一个相当复杂的SELECT查询,它在开发/测试服务器上工作正常,但在生产环境中失败了:

SELECT tbl_questions.Question, tbl_questions.QuestionCode 
FROM tbl_questions INNER JOIN (
    SELECT sg.questioncode, sg.gradeB, sg.gradeA, t2.wt 
    FROM tbl_scoregrade AS sg INNER JOIN (
        SELECT t1.QuestionCode, AVG(1.0 * aw.Weight) AS wt 
        FROM tbl_AnswerWeight AS aw INNER JOIN (
            SELECT assa.QuestionCode, assa.Answer 
            FROM tbl_AllStaffSurveyAnswers AS assa INNER JOIN 
            tbl_AllStaffSurvey AS ass ON assa.Questionguid = ass.Questionguid 
            WHERE (ass.Trust = 'RD7') AND (ass.Specialty = '97'))
        AS t1 ON aw.questioncode = t1.QuestionCode AND aw.Response = t1.Answer 
        GROUP BY t1.QuestionCode )
    AS t2 ON sg.questioncode = t2.QuestionCode AND sg.gradeA > t2.wt)
AS t3 ON tbl_questions.QuestionCode = t3.questioncode

你能看到在不同版本的SQL服务器上运行时会产生什么影响,或者在任何情况下都能简化查询的方法吗?

3 个答案:

答案 0 :(得分:2)

这不是你问题的答案,但重要的是要考虑。您有一个相当复杂的查询,它将消耗大量资源。由于复杂性,SQL Server 2000中的优化器将无法创建优化的查询计划,并且可能会使用表扫描。建议不要在SQL Server 2000中使用4个以上的连接。

我建议你尝试划分语句并使用临时表

另一件需要考虑的事情是使用“三角形连接”

ON sg.questioncode = t2.QuestionCode AND sg.gradeA > t2.wt

这是一篇关于Triangular joins

的有趣文章

此致

HåkanWinther

答案 1 :(得分:1)

我无法看到SQL的任何错误。但是,如果您收到的错误会有所帮助。

两台服务器上的架构/表结构是否相同?例如,你在SQL 2005机器上使用NVARCHAR(MAX)而在SQL 2000上使用NTEXT吗?这将阻止您的GROUP BY工作。

最后,您可以在SQL 2005上更改数据库的兼容级别。在管理工作室中,右键单击数据库,选择,属性。转到“选项”页面,选择“兼容级别”作为SQL Server 2000(80)。

答案 2 :(得分:0)

好的,这有点令人尴尬 - 事实证明(正如Robin所说)SQL本身没有任何问题;查询在ASPX应用程序中运行,结果发现web.config文件中的连接字符串错误。

但是感谢一些非常好的答案 - 罗宾关于改变兼容性水平的提示和Håkan指向三角形连接的指针绝对是我要研究的东西。