Надеюсь, я смогу объяснить это достаточно хорошо. У меня есть небольшая уникальная проблема, когда система клиента, которую мы используем, может изменить идентификатор в базе данных в фоновом режиме, основываясь на статусе продуктов.
Что это означает, когда я хочу сообщить о старых продуктах, которые у нас нет? Если больше не использовать сторонние активные продукты, то 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.