2012-01-18 56 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