Как я могу преобразовать этот код с помощью объединений вместо использования (=) или =

#sql #sql-server

#sql #sql-сервер

Вопрос:

  1. Я пытался часами преобразовать этот код (я думаю, что это Oracle) с помощью объединений в SQL Server вместо
  2. используя (=)/= но почему-то я не получаю тот же результат, что и при использовании = или =. Может кто-нибудь мне помочь?
 SELECT KNVV.MANDT, KNVV.KUNNR, 
       KNVV.VTWEG, KNVV.BZIRK, KNVP.KUNN2
 FROM  KNA1, KNVV, KNVP, CDHDR
 WHERE 
       AND `(KNVV.MANDT = KNA1.MANDT`
       AND `KNVV.KUNNR = KNA1.KUNNR)`
       AND `(KNVP.MANDT ( ) = KNVV.MANDT`
       AND `KNVP.KUNNR ( ) = KNVV.KUNNR`
       AND `KNVP.VTWEG ( ) = KNVV.VTWEG)`
       AND `(CDHDR.MANDANT ( ) = KNVV.MANDT`
       AND `CDHDR.OBJECTID ( ) = KNVV.KUNNR)`
       AND `(KNVV.VTWEG = KNVP.VTWEG)`
       AND `KNVP.PARVW ( ) = 'RG'`
       AND CDHDR.OBJECTCLAS ( ) = 'DEBI'  
 

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

1. Какие СУБД вы действительно используете SQL Server или Oracle? Кроме того, почему вы все еще используете этот древний синтаксис соединения? Он был заменен почти 30 лет назад.

2. Либо ЛЕВОЕ, либо ПРАВОЕ СОЕДИНЕНИЕ.

3. ( ) Находится на стороне таблицы, которая может возвращать нулевые строки.

4. @Larnu Привет, я использую Microsoft SQL Server, и этот древний синтаксис объединения используется в SAP ERP для текстового текста. экспорт.

Ответ №1:

Без образцов данных его сложно протестировать, но, похоже, вы хотите:

 SELECT KNVV.MANDT, KNVV.KUNNR, 
       KNVV.VTWEG, KNVV.BZIRK, KNVP.KUNN2
 FROM  KNA1
       INNER JOIN KNVV
       ON (   KNVV.MANDT = KNA1.MANDT
          AND KNVV.KUNNR = KNA1.KUNNR
          )
       INNER JOIN KNVP
       ON (   KNVP.MANDT = KNVV.MANDT
          AND KNVP.KUNNR = KNVV.KUNNR
          AND KNVP.VTWEG = KNVV.VTWEG
          AND KNVV.VTWEG = KNVP.VTWEG -- This duplicated condition makes it an
                                      -- INNER JOIN and not a LEFT OUTER JOIN as
                                      -- you are not using ( ) in Oracle's legacy
                                      -- syntax.
          AND KNVP.PARVW = 'RG'
          )
       LEFT OUTER JOIN CDHDR
       ON (   CDHDR.MANDANT    = KNVV.MANDT
          AND CDHDR.OBJECTID   = KNVV.KUNNR
          AND CDHDR.OBJECTCLAS = 'DEBI'
          )
 

Вероятно, вы хотите сделать второе соединение a LEFT OUTER JOIN вместо an INNER JOIN , но это не то, что делает ваш текущий запрос, поскольку вы используете (KNVV.VTWEG = KNVP.VTWEG) , а не (KNVV.VTWEG = ( ) KNVP.VTWEG) в вашем запросе Oracle.

Ответ №2:

Ваш запрос может быть преобразован в:

 select
  KNVV.MANDT, 
  KNVV.KUNNR, 
  KNVV.VTWEG, 
  KNVV.BZIRK, 
  KNVP.KUNN2
from KNA1
join KNVV on KNVV.MANDT = KNA1.MANDT
         and KNVV.KUNNR = KNA1.KUNNR
left join KNVP on KNVP.MANDT = KNVV.MANDT -- left join defeated!
              and KNVP.KUNNR = KNVV.KUNNR
              and KNVP.VTWEG = KNVV.VTWEG
              and KNVP.PARVW = 'RG'
left join CDHDR on CDHDR.MANDANT = KNVV.MANDT
               and CDHDR.OBJECTID = KNVV.KUNNR
               and CDHDR.OBJECTCLAS = 'DEBI'  
where KNVV.VTWEG = KNVP.VTWEG -- silently converts left join into inner join
 

ПРИМЕЧАНИЕ: исходный запрос неверно сформирован

Несмотря на то, что исходный запрос пытался выполнить левое соединение с таблицей KNVP , это соединение автоматически преобразуется движком во внутреннее соединение. Вы уверены, что этот запрос работает должным образом?

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

1. KNVP.PARVW = 'RG' похоже, что условие соединения неверно.

2. @MT0 Хороший улов! исправлено.

Ответ №3:

Вы пробовали внутреннее СОЕДИНЕНИЕ?

 SELECT KNVV.MANDT, KNVV.KUNNR, 
   KNVV.VTWEG, KNVV.BZIRK, KNVP.KUNN2
FROM KNA1, KNVV, KNVP, CDHDR
INNER JOIN KNVV ON KNA1.MANDT=KNVV.MANDT;
 

Что-то в этом смысле более удобное.
документация ниже
https://www.w3schools.com/sql/sql_join.asp

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

1. ( ) = является ли СОЕДИНЕНИЕ ЛЕВЫМ или ПРАВЫМ — не могу вспомнить, каким.

2. Я думаю, это левое соединение 🙂