#sql #sql-server
#sql #sql-сервер
Вопрос:
- Я пытался часами преобразовать этот код (я думаю, что это Oracle) с помощью объединений в SQL Server вместо
- используя (=)/= но почему-то я не получаю тот же результат, что и при использовании = или =. Может кто-нибудь мне помочь?
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. Я думаю, это левое соединение 🙂