Как присоединиться к таблице, где результат может иногда приводить со знаком? - PullRequest
0 голосов
/ 10 января 2020

Надеюсь, я смогу объяснить это достаточно хорошо. У меня есть небольшая уникальная проблема, когда система клиента, которую мы используем, может изменить идентификатор в базе данных в фоновом режиме, основываясь на статусе продуктов.

Что это означает, когда я хочу сообщить о старых продуктах, которые у нас нет? Если больше не использовать сторонние активные продукты, то ID этих двух таблиц ключей различается в зависимости от их статуса. Это означает, что активные продукты в таблице продуктов совпадают с данными в таблице товарных позиций, причем оба значения отображаются как 647107376, но когда продукт больше не активен, таблица StockItem будет отображаться как 647107376, но таблица, содержащая информацию о продукте, Идентификатор представлен как -647107376

Для меня это проблематично c, когда я собираюсь объединить таблицы, чтобы получить необходимую информацию. Первоначально мой запрос был настроен следующим образом:

SELECT

Company_0.CoaCompanyName
,SopProduct_0.SopStiStockItemCode AS hbpref
,SopProduct_0.SopStiCustomerStockCode AS itemref
,SopProduct_0.SopDescription AS ldesc
,StockMovement_0.StmOriginatingEntityID AS Goodsin

FROM 
SBS.PUB.StockItem StockItem_0 
LEFT JOIN SBS.PUB.SopProduct SopProduct_0 ON StockItem_0.StockItemID = SopProduct_0.StockItemID
LEFT JOIN SBS.PUB.Company Company_0 ON SopProduct_0.CompanyID = Company_0.CompanyID
LEFT JOIN SBS.PUB.StockMovement StockMovement_0 ON StockItem_0.StockItemID = StockMovement_0.StockItemID

WHERE 

Company_0.CoaCompanyName = ?
AND StockMovement_0.MovementTypeID = '173355'
AND StockMovement_0.StmMovementDate >= ? AND StockMovement_0.StmMovementDate <= ?
AND StockMovement_0.StmQty <> 0
AND StockMovement_0.StockTypeID ='12049886'

К сожалению, хотя это означает, что любой из старых продуктов не будет отображаться, потому что нет соответствующего идентификатора из-за таблицы SopProduct, представляющей StockItemID с лидирующим -

Так что из этого я подумал, что лучше всего использовать оператор case when с вложенными concat и left для получения результатов, но это не похоже на используйте любой из приведенных ниже примеров объединения:

LEFT JOIN SBS.PUB.SopProduct SopProduct_0 ON (CASE WHEN LEFT(SopProduct_0.StockItemID,1) = "-" THEN CONCAT("-",StockItem_0.StockItemID) ELSE StockItem_0.StockItemID END) = SopProduct_0.StockItemID

Может кто-нибудь еще придумать способ обойти эту проблему? Я работаю с Progress OpenEdge ODB C.

Ответы [ 2 ]

1 голос
/ 10 января 2020

Числа выглядят как числа. Если это так, вы можете использовать abs():

ON StockItem_0.StockItemID = ABS(SopProduct_0.StockItemID)

В противном случае относительно простым методом является:

ON StockItem_0.StockItemID IN (SopProduct_0.StockItemID, CONCAT('-', SopProduct_0.StockItemID))

Обратите внимание, что условия неравенства часто замедляют JOIN операции.

1 голос
/ 10 января 2020

Использование or в объединении должно работать:

LEFT JOIN SBS.PUB.SopProduct SopProduct_0 
   ON SopProduct_0.StockItemID = StockItem_0.StockItemID
      OR
      SopProduct_0.StockItemID = CONCAT("-", StockItem_0.StockItemID)

Вам может понадобиться cast результат concat для числа (если идентификаторы хранятся в виде чисел).

Или вы также можете использовать функцию abs (при условии, что идентификаторы являются числами):

LEFT JOIN SBS.PUB.SopProduct SopProduct_0 
   ON SopProduct_0.StockItemID = abs(StockItem_0.StockItemID)
...