Я унаследовал запрос, который был сделан предыдущим разработчиком, и он связывает около 6 таблиц с левыми объединениями, и я получаю дублирующие данные по какой-то причине, когда строка добавляется в таблицу Paliized, фактически дублирующую 2 строки, которая вроде как, и я не могу понять это
Я использую Microsoft SQL Server 2014 на случай, если что-то изменится
SELECT
pp.ProductionPlanID, pp.WeekStartDate, pp.WeekEndDate,
ppi.ProductionPlanItemID, ppi.SOPOrderReturnLineID,
bat.ProductionPlanBatchID, sop.DocumentNo,
cust.CustomerAccountName, bat.Name AS BatchName,
si.ItemID, si.Code AS StockCode, si.Name AS StockName,
sopLine.AllocatedQuantity, o.Quantity AS LineQty
FROM
ProductionPlan pp
LEFT JOIN
ProductionPlanItem ppi ON pp.ProductionPlanID = ppi.ProductionPlanID
LEFT JOIN
ProductionPlanBatch ppb ON ppi.ProductionPlanBatchID = ppb.ProductionPlanBatchID
LEFT JOIN
SOPOrderReturnLine sopLine ON ppi.SOPOrderReturnLineID = sopLine.SOPOrderReturnLineID
LEFT JOIN
SOPOrderReturn sop ON sopLine.SOPOrderReturnID = sop.SOPOrderReturnID
LEFT JOIN
SLCustomerAccount cust ON sop.CustomerID = cust.SLCustomerAccountID
LEFT JOIN
StockItem si ON sopLine.ItemCode = si.Code
LEFT JOIN
ProductionPlanBatch bat ON ppi.ProductionPlanBatchID = bat.ProductionPlanBatchID
LEFT JOIN
Boxed boxed ON sopLine.SOPOrderReturnLineID = boxed.SopItemLineID
AND pp.ProductionPlanID = boxed.ProductionPlanID
LEFT JOIN
Palletized palletized ON sopLine.SOPOrderReturnLineID = palletized.SopItemLineID
AND pp.ProductionPlanID = palletized.ProductionPlanID
CROSS APPLY
(SELECT 1 FROM master..spt_values v
WHERE v.type = 'P'
AND v.number < ISNULL(boxed.QtyBoxed, 0) - ISNULL(palletized.QtyOnPallet, 0)) o(Quantity)
WHERE
ProductionPlanID = 5801244
В основном то, что происходит в программном обеспечении, они удаляют строку из штучной упаковки и помещают строку в таблицу Palletized, но из таблицы с сортировкой в этом представлении появляются две строки в таблице блоков, когда этого не должно быть.
Мое главное недоразумение - это строка кода.
CROSS APPLY (SELECT 1
FROM master..spt_values v
WHERE v.type = 'P'
AND v.number < ISNULL(boxed.QtyBoxed, 0) - ISNULL(palletized.QtyOnPallet, 0)) o (Quantity)
Я никогда раньше не видел таблицу spt.values
, и я не уверен, что именно она делает. Я не могу предоставить данные с помощью этого запроса, но я полагаю, что некоторые DBA могут помочь мне понять, откуда происходит дублирование.