2012-01-18 54 views
0

我有以下的SQL语法。这工作正常,但我想知道是否有一种方法来写这个语法更简单,因为MAX(ra0.DescPriority)使用相同的表连接。更简单的SQL语法?哪个更好的语法?

SELECT DISTINCT Items_1.ImageID, Items_1.SubcategoryID2, Items_1.AddDate, 
           (SELECT  MAX(ra0.DescPriority) AS Expr1 
            FROM   Items INNER JOIN 
                  Attribs AS ra0 ON Items.ImageID = ra0.ImageID) AS Pri 
    FROM   Items AS Items_1 INNER JOIN 
          Attribs AS ra0 ON Items_1.ImageID = ra0.ImageID LEFT OUTER JOIN 
          v_DisplayStockPrice AS v_DisplayStockPrice_1 ON Items_1.ImageID = v_DisplayStockPrice_1.ImageID INNER JOIN 
          Attribs AS ra1 ON ra0.ImageID = ra1.ImageID 
    WHERE  (Items_1.deleted NOT IN (1, 2)) AND (Items_1.SubcategoryID2 = 'ORD') 
    ORDER BY Pri, Items_1.AddDate DESC 

所以我想出了这个语法。

SELECT DISTINCT Items_1.ImageID, Items_1.SubcategoryID2, Items_1.AddDate, MAX(ra0.DescPriority) AS Pri 
FROM   Items AS Items_1 INNER JOIN 
         Attribs AS ra0 ON Items_1.ImageID = ra0.ImageID LEFT OUTER JOIN 
         v_DisplayStockPrice AS v_DisplayStockPrice_1 ON Items_1.ImageID = v_DisplayStockPrice_1.ImageID INNER JOIN 
         Attribs AS ra1 ON ra0.ImageID = ra1.ImageID 
WHERE  (Items_1.deleted NOT IN (1, 2)) AND (Items_1.SubcategoryID2 = 'ORD') 
GROUP BY Items_1.ImageID, Items_1.SubcategoryID2, Items_1.AddDate 
ORDER BY Pri, Items_1.AddDate DESC 

哪种SQL语法更好?或者有更好的方法来写这个查询?

+0

如果您可以将您的示例归结为您所询问的基本差异,那么您会得到更好的答案。 – harpo 2012-01-18 02:34:01

+0

很难理解在from子句中有混合连接的查询,以及select子句中的子查询(它们只是连接的一种替代形式)。你应该如何表达你的连接是一致的。如果没有详细研究你的SQL,我宁愿你的第二个语法示例,因为所有连接都以相同的方式表示。 – 2012-01-18 04:47:47

回答

1

第二个看起来更好,可能表现更好,但真的应该使用查询分析器。它会告诉你究竟哪一个更好: http://msdn.microsoft.com/en-us/library/aa216945(v=sql.80).aspx

调试查询性能问题。 (显示执行计划,显示服务器跟踪,显示客户统计,索引优化向导)

下面是如何使用查询执行计划的描述: http://www.sql-server-performance.com/2006/query-execution-plan-analysis/

+0

我会尝试查询分析器。谢谢! – shinya 2012-01-18 07:02:52

0

我使用了SQL提示,让您查询一下这里更好。请注意,您的第三个连接没有做任何事情,并且INNER JOIN,OUTER JOIN,INNER JOIN的模式不正确,请勿使用它。

SELECT DISTINCT 
     Items_1.ImageID , 
     Items_1.SubcategoryID2 , 
     Items_1.AddDate , 
     MAX(ra0.DescPriority) AS Pri 
FROM Items AS Items_1 
     INNER JOIN Attribs AS ra0 ON Items_1.ImageID = ra0.ImageID 
     LEFT OUTER JOIN v_DisplayStockPrice AS v_DisplayStockPrice_1 ON Items_1.ImageID = v_DisplayStockPrice_1.ImageID 
     INNER JOIN Attribs AS ra1 ON ra0.ImageID = ra1.ImageID 
WHERE (Items_1.deleted NOT IN (1, 2)) 
     AND (Items_1.SubcategoryID2 = 'ORD') 
GROUP BY Items_1.ImageID , 
     Items_1.SubcategoryID2 , 
     Items_1.AddDate 
ORDER BY Pri , 
     Items_1.AddDate DESC 
+0

...或者至少如果您需要混合内连接和外连接,请使用括号使连接顺序清晰。 – 2012-01-18 04:45:08

+0

谢谢你的建议。第三次加入是为了其他条件。 Where子句将使用更多的条件使用ra0值。 – shinya 2012-01-18 07:10:03