Это дублирование, потому что у вас нет вторичной связи между Invoice_Item и Item_Order. Для каждой записи в Invoice_Item она соответствует Item_Order (известному как декартовой результат), основываясь ТОЛЬКО на ID элемента. Таким образом, ваш заказ qty, по-видимому, будет ссылкой 1: 1, так что первый элемент Qty of Invoice из 10 MEANT будет связан с Item_Order Box = 30. и Qty 8 будет MEANT быть связанным с Item_Order Box = 12.
Item_Order
Item Box Quantity
1 30 15000
1 12 6000
Invoice_Item
Item Num Quantity
1 1.64 10
1 2.4 8
Вам, вероятно, нужно прикрепить ссылку "Box", чтобы Item_Order и Invoice_Item соответствовали 1: 1.
То, что происходит для каждого элемента в Invoice Item, объединяется с Item_Order на основе на элементе ID. Итак, вы получаете два. Если бы у вас было 3 элемента счета с 1 и 6 из Item_Order, вы бы получили 18 строк.
ОБРАТНАЯ СВЯЗЬ
Даже если у вас есть принятый ответ, основанный на OVER / PARTITION / NOWBER NOWBER, этот процесс принудительно устанавливает суррогатный вторичный идентификатор для каждой строки. Полагаться на этот подход не лучше для общей ассоциации структуры данных. Что произойдет, если вы удалите второй элемент в заказе. Вы уверены, что удаляете второй элемент в invoice_items?
Что касается возврата 2 записей в исходном сценарии, вы можете с помощью суррогатного процесса, но я думаю, что было бы лучше для вас в долгосрочной перспективе понять, что происходит на соединении. Возвращаясь к вашим образцам данных Item_Order и Invoice_Item. Итак, давайте начнем с таблицы Item_Order. Движок SQL будет обрабатывать каждую строку индивидуально.
Первая строка SQL захватывает Item = 1, Box = 30, Qty = 15000.
Так что теперь он присоединяется к Invoice Элемент таблицы, и так как ваши критерии он присоединяется только на основе элемента. Итак, он видит первую строку и говорит ... да, это элемент 1, так что включите его с записью порядка элементов (возвращается первая строка). Теперь он переходит ко второй строке таблицы элементов счета-фактуры ... да, это тоже тот же элемент 1, поэтому он возвращает его снова (возвращается вторая строка).
Теперь SQL захватывает вторую Строка Item = 1, Box = 12, Кол-во = 6000.
Возвращается к таблице «Счет-фактура» и выполняет точно такой же тест ... и для каждой строки в Порядке элементов, у которой есть Item = 1, и 3-я и 4-я строки, следовательно, ваше удвоение ... Если бы в любой таблице было больше записей с одинаковым идентификатором элемента, она вернула бы столько же записей ... 3 и 3 записи вернули бы 9 строк. Записи 4 и 4 вернут 16 строк и т. Д. c. Выполнение суррогата будет работать, но я не думаю, что это так безопасно, как улучшенная / обновленная структура дизайна.