У меня есть таблицы Machine
и Inventory
. В таблице Machine
у меня есть свойства последнего запущенного инвентаря. В таблице Inventory
у меня есть новый идентификатор и свойства инвентаря (еще не запущенные на машине).
Мне нужно вернуть список возможных комбинаций инвентаря, которые могут работать на машинах, на основе последнего запущенного инвентаря. И мне также нужно вернуть список машин без дубликатов инвентаря.
Для получения списка возможных комбинаций инвентаря, которые могут работать на машинах, на основе последнего запущенного инвентаря я попробовал использовать CROSS JOIN
, и это работает [См. 1].
Но для списка машин без дубликатов инвентаря я понятия не имею, как это сделать [См. 2]?
Machine
таблица - станок с последним работающим инвентарем:
Inventory
таблица - новый инвентарь (еще не обкатанный в машинах):
Мне нужно получить все комбинации (Machine CROSS JOIN Inventory
где цвет и размер совпадают)
SELECT
m.Machine, i.Inventory, m.Color, m.Size
FROM
Machine m
CROSS JOIN
Inventory i
WHERE
i.Color = m.Color AND i.Size = m.Size
Мне не нужно иметь дублирующийся инвентарь (1 машина, 1 инвентарь)
Для [2] я попытался сделать в коде цикл машин и найти 1 на 1 на основе цвета и размера в таблице инвентаря и назначить.
Затем исключите тот, который я уже назначил для следующей машины.
Но чтобы все перебрать, потребовалось некоторое время.
Почему в ожидаемом результате у A 114, а не 115? и почему у B 115, а не 114? Какова именно логика?
@GuidoG нет фиксированной логики: если 114 назначено A, то 115 должно быть назначено B. И наоборот.
Похоже, на самом деле вы хотите не every combination
, а просто присвоение 1 machine
к 1 inventory
.
Вы можете использовать row_number()
, чтобы сгенерировать порядковый номер, а затем использовать его для присоединения.
select m.machine, i.inventory
from (
select machine, color, size,
rn = row_number() over (partition by color, size
order by machine)
from Machine
) m
inner join
(
select inventory, color, size,
rn = row_number() over (partition by color, size
order by inventory)
from Inventory
) i on m.color = i.color
and m.size = i.size
and m.rn = i.rn
GuidoG любезно предоставил демо-версию скрипта
Поскольку я уже сделал скрипку, я вставил в нее ваш запрос, здесь вы можете увидеть, как это работает, я не могу придумать лучшего ответа
Спасибо @GuidoG, я отредактирую и включу эту скрипку в ответ.
@DaleK Я добавил запрос в вопрос