Я считаю, что это должно работать:
INSERT INTO G_To_S_Map (G_id, S_id)
(SELECT :inputGId, a.S_id
FROM S_To_T_Map as a
LEFT JOIN G_To_S_Map as b
ON b.S_id = a.S_id
AND b.G_id = :inputGId
WHERE a.T_id = :inputTId
AND b.G_id IS NULL
ORDER BY a.S_id
LIMIT 1);
<ч />
РЕДАКТИРОВАТЬ:
Если вы хотите сделать заказ по другой таблице, используйте эту версию:
INSERT INTO G_To_S_Map (G_id, S_id)
(SELECT :inputGId, a.S_id
FROM S_To_T_Map as a
JOIN S as b
ON b.S_id = a.S_id
LEFT JOIN G_To_S_Map as c
ON c.S_id = a.S_id
AND c.G_id = :inputGId
WHERE a.T_id = :inputTId
AND c.G_id IS NULL
ORDER BY b.S_num
LIMIT 1);
(Кроме того, я действительно надеюсь, что ваши таблицы на самом деле не названы так, потому что это ужасная вещь. Использование Map
, особенно, должно , вероятно, следует избегать)
<ч />
EDIT:
Вот несколько примеров тестовых данных. Я что-то пропустил? Я неправильно осмыслил отношения?
S_To_T_Map
================
S_ID T_ID
1 1
2 1
3 1
1 2
1 3
3 3
G_To_S_Map
==================
G_ID S_ID
1 1
3 1
2 1
3 2
2 3
3 3
Результирующие объединенные данные:
(CTE используются для генерации тестовых данных перекрестного соединения)
Results:
=============================
G_TEST T_TEST S_ID
1 1 3
2 1 2
1 3 3
<ч />
РЕДАКТИРОВАТЬ:
Ах, хорошо, теперь у меня проблема. Моя проблема заключалась в том, что я предполагал, что между S
и G
были какие-то отношения типа «один-один». Поскольку это не так, используйте это исправленное утверждение:
INSERT INTO G_To_S_Map (G_id, S_id)
(SELECT :inputGId, a.S_id
FROM S_To_T_Map as a
JOIN S as b
ON b.S_id = a.S_id
LEFT JOIN G_To_S_Map as c
ON c.S_id = a.S_id
OR c.G_id = :inputGId
WHERE a.T_id = :inputTId
AND c.G_id IS NULL
ORDER BY b.S_num
LIMIT 1);
В частности, строка, проверяющая G_To_S_Map
для строки, содержащей G_Id
, должна быть переключена с использования AND
на OR
- ключевое требование , которое не было указано ранее тот факт, что G_Id
и S_Id
были уникальными в G_To_S_Map
.
Этот оператор не вставит строку, если либо предоставленный G_Id
был сопоставлен ранее, либо если все S_Id
сопоставлены с данным T_Id
, были сопоставлены.