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

+0

Трудно понять запросы, которые имеют смесь объединений в предложении from и подзапросы в предложении select (которые являются просто альтернативной формой объединения). Вы должны быть последовательны в том, как вы выражаете свои объединения. Не изучая ваш SQL слишком подробно, я бы предпочел ваш второй пример синтаксиса, потому что все соединения выражены одинаково. –

ответ

1

Второй выглядит лучше и, вероятно, работает лучше, но на самом деле вы должны использовать Query Analyzer. Он скажет вам точно, какой из них лучше: http://msdn.microsoft.com/en-us/library/aa216945(v=sql.80).aspx

проблемы отладки производительности запросов. (Показать план выполнения, Показать сервер Trace, Показать статистику клиента, мастер Index Tuning)

Вот описание того, как использовать план выполнения запроса: http://www.sql-server-performance.com/2006/query-execution-plan-analysis/

+0

Я попробую анализатор запросов. Спасибо! – shinya

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

... или, по крайней мере, если вам нужно смешать внутренние соединения и внешние соединения, используйте круглые скобки, чтобы сделать порядок соединения чистым. –

+0

Благодарим вас за советы. Третье соединение - для других условий. Там, где условие будет иметь больше условий, используя значение ra0. – shinya

Смежные вопросы