Левое внешнее соединение не выбирает все строки - PullRequest
0 голосов
/ 29 мая 2018

Я хочу выбрать все уведомления с соответствующей информацией, как вы можете видеть ниже.Я также хочу уведомления, которые не имеют оборудования.Но когда я использую следующее соединение, я получаю только те, где оборудование не равно нулю.Разве левое внешнее соединение не должно убедиться, что я получаю все в таблице VIQMEL?Я получаю уведомления, у которых нет оборудования, если я удаляю « AND K ~ SPRAS EQ 'E' ».

Есть идеи, как решить эту проблему?

ЛЕВЫЙ ВНЕШНИЙ ОБЪЕДИНЯЙТЕ EQKT AS K ON V ~ EQUNR EQ K ~ EQUNR

  SELECT V~QMNUM, V~QMART, T~ISTAT, T~TXT30, V~AUFNR, V~TPLNR, V~EQUNR, V~BTPLN, V~QMNAM, V~QMGRP,
  V~QMCOD, CT~KURZTEXT, GT~KURZTEXT, V~BEBER, K~EQKTX, V~QMTXT, FX~PLTXT, AX~PLTXT, V~PRIOK, V~ERDAT, S~TDID, A~RELTYPE, Z~ADUSER
  FROM VIQMEL AS V
  LEFT OUTER JOIN IFLOT     AS F  ON V~TPLNR       EQ F~TPLNR
  LEFT OUTER JOIN JEST      AS J  ON J~OBJNR       EQ V~OBJNR
  LEFT OUTER JOIN TJ02T     AS T  ON T~ISTAT       EQ J~STAT
  LEFT OUTER JOIN IFLOTX    AS FX ON FX~TPLNR      EQ V~TPLNR
  LEFT OUTER JOIN IFLOTX    AS AX ON AX~TPLNR      EQ V~BTPLN
  LEFT OUTER JOIN QPCT      AS CT ON CT~CODE       EQ V~QMCOD
  LEFT OUTER JOIN EQKT      AS K  ON V~EQUNR       EQ K~EQUNR
  LEFT OUTER JOIN QPGT      AS GT ON GT~CODEGRUPPE EQ V~QMGRP
  LEFT OUTER JOIN STXH      AS S  ON S~TDNAME      EQ V~QMNUM
  LEFT OUTER JOIN SRGBTBREL AS A  ON V~QMNUM       EQ A~INSTID_A
  LEFT OUTER JOIN ZZID_MAP  AS Z  ON V~QMNAM       EQ Z~SAPUSER
  WHERE T~SPRAS EQ @IV_SPRAS
  AND V~QMNUM LIKE @P_QMNUM
  AND V~EQUNR LIKE @P_EQUNR
  AND V~QMNAM LIKE @P_QMNAM
  AND V~AUFNR LIKE @P_AUFNR
  AND F~TPLNR LIKE @P_TPLNR
  AND T~ISTAT LIKE @P_ISTAT
  AND V~BEBER LIKE @P_BEBER
  AND J~INACT NE @ABAP_TRUE
  AND T~ISTAT NE 'I0076'
  AND T~SPRAS EQ 'E'
  AND FX~SPRAS EQ 'E'
  AND K~SPRAS EQ 'E'
  INTO TABLE @ET_NOTIFS.

1 Ответ

0 голосов
/ 29 мая 2018

Примечание: EQKT - это краткий текст об оборудовании (не об оборудовании), а EQKT~SPRAS - это язык. Проблема: Вы написали ваше условие для выбора только текста на английском языке, поэтому игнорирует записи, которые объединены с неанглийскими, или записи, которые вообще не объединяются .

Так что, если у вас есть (число представляет ключ), ваша текстовая таблица

1   E    ....
2   X    ....
3   N    ....
4   E    ....

После объединения тексты из таблицы объединяются следующим образом:

1   E    ....
2   [initial]
3   [initial] 
4   E    ....

После фильтрации у вас остается

1   E    ....
4   E    ....

Решения

Неоправданно сложное решение с использованием подзапроса исключения

С ограничениями SAP Open SQL, за исключением объединений, а также объединений, в том числе на основе записейоб отсутствии соответствующих записей из других таблиц не представляется возможным. Временные решения для исключения объединений - это, как правило, подзапросы.

Можно добавить подзапрос для проверки выбранных языков на основе вашего фильтра и игнорировать этот фильтр в других случаях (включая пустые записи).Попробуйте заменить and K~SPRAS EQ 'E' на следующее (идея состоит в том, чтобы взять язык, если он существует, и обойти условие в противном случае):

   and ( K~SPRAS in (select SPRAS from EQKT where EQUNR=V~EQUNR and spras = 'E') 
     OR NOT EXISTS (select SPRAS from EQKT where spras = 'E')
   ) 

Идея в том, что у вас есть 2 подзапроса.Один из них использует положительный чек, чтобы включал все языки, которые вам нужны.Другой использует отрицательную проверку и включает записи, в которых этот конкретный язык не существует.


Обновление: минималистическое решение (соединение левой клавишей + условие)

После просмотра вашего вопроса сЯ заметил, что мое решение может быть слишком сложным для ваших нужд (даже если оно будет работать).

Стандартное левое соединение по ключу + условие выполнит ваше требование.Переместите and K~SPRAS EQ 'E' в состояние соединения, и оно выберет именно то, что вам нужно (стандартное соединение слева).Кроме того, если я правильно помню, ключевое слово outer ничего не делает при левом / правом соединениях.

  LEFT JOIN EQKT      AS K  ON V~EQUNR       EQ K~EQUNR AND K~SPRAS EQ 'E'

PS: псевдонимы и избыточные объединения в вопросе не помогают с его удобочитаемостью.

...