Объединение таблиц с условием, что все значения строк уникальны

У меня есть таблицы Machine и Inventory. В таблице Machine у меня есть свойства последнего запущенного инвентаря. В таблице Inventory у меня есть новый идентификатор и свойства инвентаря (еще не запущенные на машине).

Мне нужно вернуть список возможных комбинаций инвентаря, которые могут работать на машинах, на основе последнего запущенного инвентаря. И мне также нужно вернуть список машин без дубликатов инвентаря.

Для получения списка возможных комбинаций инвентаря, которые могут работать на машинах, на основе последнего запущенного инвентаря я попробовал использовать CROSS JOIN, и это работает [См. 1].

Но для списка машин без дубликатов инвентаря я понятия не имею, как это сделать [См. 2]?

Machine таблица - станок с последним работающим инвентарем:

Машина Инвентарь Цвет Размер А 1111 Красный Маленький Б 1112 Красный Маленький С 1113 Зеленый Большой

Inventory таблица - новый инвентарь (еще не обкатанный в машинах):

Инвентарь Цвет Размер 1114 Красный Маленький 1115 Красный Маленький 1116 Зеленый Большой

Мне нужно получить все комбинации (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
Машина Инвентарь Цвет Размер А 1114 Красный Маленький А 1115 Красный Маленький Б 1114 Красный Маленький Б 1115 Красный Маленький С 1116 Зеленый Большой

Мне не нужно иметь дублирующийся инвентарь (1 машина, 1 инвентарь)

Машина Инвентарь Цвет Размер А 1114 Красный Маленький Б 1115 Красный Маленький С 1116 Зеленый Большой

Для [2] я попытался сделать в коде цикл машин и найти 1 на 1 на основе цвета и размера в таблице инвентаря и назначить.

Затем исключите тот, который я уже назначил для следующей машины.

Но чтобы все перебрать, потребовалось некоторое время.

@DaleK Я добавил запрос в вопрос

lawd 10.07.2024 06:58

Почему в ожидаемом результате у A 114, а не 115? и почему у B 115, а не 114? Какова именно логика?

GuidoG 10.07.2024 07:13

@GuidoG нет фиксированной логики: если 114 назначено A, то 115 должно быть назначено B. И наоборот.

lawd 10.07.2024 07:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, на самом деле вы хотите не 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 10.07.2024 07:59

Спасибо @GuidoG, я отредактирую и включу эту скрипку в ответ.

Squirrel 10.07.2024 10:40

Другие вопросы по теме