Поведение внешнего соединения Sybase

#sql #sap-ase

#sql #sap-ase

Вопрос:

Я работаю над некоторым устаревшим SQL (написанным на языке sybase) и преобразовываю его в форму, совместимую с SQL-92. Проблема в том, что я не могу понять, как ведет себя «* =».

запрос (подвергнутый соответствующей цензуре):

 SELECT 
    C.*, SUM(P.qty) from Cars C, Parts P
WHERE 
    C.carid = 1
AND C.carid *= P.carid
AND C.missingpart *= P.missingpart
AND C.manufacturer *= P.manufacturer
AND P.qty is not null
GROUP BY C.carid, C.missingpart, C.manufacturer
  

Я преобразовал его в:

 SELECT
    C.*, SUM(P.qty) from Cars C
        LEFT JOIN Parts P
        ON C.carid = P.carid
        AND C.missingpart = P.missingpart
        AND C.manufacturer = P.manufacturer
WHERE
    C.carid = 1
AND P.qty is not null
GROUP BY C.carid, C.missingpart, C.manufacturer
  

Но оказывается — они не эквивалентны. Может кто-нибудь помочь мне понять, каково точное поведение «* =» во внешних соединениях sybase и почему мои два запроса не идентичны?

Спасибо 🙂

PS: Я использую Sybase ASE TDS 5.5

Ответ №1:

Попробуйте перейти AND P.qty is not null от предложения WHERE к выражению join.

Комментарии:

1. Я нашел эту ссылку: sybase.com/content/1017447/tsql.pdf многое объясняет в этом siht.