2012-06-22 2 views
7

Я занят преобразованием запроса с использованием синтаксиса старого стиля в новый синтаксис соединения. Суть моего запроса выглядит следующим образом:SQL Inner Join. ON условие vs WHERE

Оригинал запроса

SELECT i.* 
FROM 
    InterestRunDailySum i, 
    InterestRunDetail ird, 
    InterestPayments p 
WHERE 
    p.IntrPayCode = 187 
    AND i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode 
    AND ird.IntRunCode = p.IntRunCode AND ird.ClientCode = p.ClientCode 

Новый запрос

SELECT i.* 
    FROM InterestPayments p 
    INNER JOIN InterestRunDailySum i 
     ON (i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode) 
    INNER JOIN InterestRunDetail ird 
     ON (ird.IntRunCode = p.IntRunCode AND ird.IntRunCode = p.IntRunCode) 
    WHERE 
    p.IntrPayCode = 187 

В этом примере, "Original Query" возвращает 46 строк, где "Новый запрос" возвращает более 800

Может кто-нибудь объяснить мне разницу? Я бы предположил, что эти запросы идентичны.

ответ

17

Проблема с вашим присоединением к InterestRunDetail. Вы дважды присоединяетесь к IntRunCode.

Правильный запрос должен быть:

SELECT i.* 
    FROM InterestPayments p 
    INNER JOIN InterestRunDailySum i 
     ON (i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode) 
    INNER JOIN InterestRunDetail ird 
     ON (ird.IntRunCode = p.IntRunCode AND ird.ClientCode = p.ClientCode) 
    WHERE 
    p.IntrPayCode = 187 
+1

Спасибо, Кевин, я чувствую себя дураком за то, что не заметил этого !! – Russell

+2

Это происходит со всеми нами. :-) –

4

«Новый запрос» является совместимой с текущим стандартом ANSI SQL для соединения.

Кроме того, я считаю запрос # 2 много очистителя:

  • вы почти вынуждены думать и указать условия соединения (ы) между двумя столами - вы случайно не имеете декартовы продуктов в вашем запросе. Если вам выпадет список из десяти таблиц, но только шесть условий соединения в вашем предложении WHERE - вы получите намного больше данных назад, чем ожидалось!

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

  • типа вашей JOIN (будь INNER JOIN, LEFT OUTER JOIN, CROSS JOIN), как правило, намного легче увидеть - так как вы это произносите. С синтаксисом «старого стиля», разница между теми, кто присоединиться типы довольно трудно увидеть, похоронен где-то в ваших много WHERE критериев .....

Функционально две одинаковые - # 1 может быть устаревшим раньше или позже некоторыми механизмами запросов.

Также см отличный пост Bad Habits to Kick - using old-style JOIN syntax блоге Аарона Бертрана для получения дополнительной информации - и в то время как вы на него - читать все «плохие привычки пинать» сообщения - все очень много стоит!

+1

Хороший ответ - но его запросы на самом деле не идентичны - похоже, что это была просто опечатка ;-) –

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