Я должен сопоставить каждую запись в TABLE1 с максимум 1 записью в TABLE2.Существует лучший способ сопоставления (равенство кодов) и плохой (в случае отсутствия равенства кодов, давайте отсортируем по кодам и сопоставим по индексу).
Давайте в качестве первого приближения предположим, что код делает этоможет выглядеть так:
SELECT
TABLE1.CODE AS CODE1,
TABLE2.CODE AS CODE2
FROM
(SELECT ROW_NUMBER() OVER(ORDER BY CODE) INDEX, CODE FROM TABLE1) T1
LEFT JOIN
(SELECT ROW_NUMBER() OVER(ORDER BY CODE) INDEX, CODE FROM TABLE2) T2
ON
(T1.CODE=T2.CODE) --CODE equality
OR
(T1.INDEX=T2.INDEX) --CODE equality
Давайте рассмотрим эти таблицы:
TABLE1 TABLE2
+------+ +------+
| CODE | | CODE |
+------+ +------+
| AAA | | BBB |
| BBB | | CCC |
| CCC | | DDD |
+------+ +------+
Результат будет:
CODE1 CODE2
----- -----
AAA BBB -> matched because of INDEX equality
BBB BBB -> matched because of CODE equality
BBB CCC -> matched because of INDEX equality
CCC CCC -> matched because of CODE equality
CCC DDD -> matched because of INDEX equality
Вот и возникнет трудность: я быЯ хотел бы выразить мнение, что, несмотря на то, что есть два условия сопоставления, которые не являются взаимоисключающими, первое должно быть предпочтительным второму, если это возможно, а второе должно оцениваться тогда и только тогда, когда первоетерпит неудачу.
Требуемый результат:
CODE1 CODE2
----- -----
AAA DDD -> matched because of INDEX equality between the cast-off records not able to match better
(corrected from the previous version where AAA was said to match expectedly with BBB)
BBB BBB -> matched thanks to CODE equality, no need to match on INDEX
CCC CCC -> matched thanks to CODE equality, no need to match on INDEX
И, конечно, я бы предпочел получить такое поведение все-в-одном, чтобы избежать сценария из нескольких шагов, учитывая, что:
вы можете свободно предлагать совершенно другой запрос: приведенный выше был просто для иллюстрации общей идеи, но ясно, что он не соответствует потребностям.Таким образом, нет необходимости пытаться сохранить его структуру.
Меня не очень интересует производительность по сравнению с желанием выполнить сопоставление по запросу "все в одном".Если нужны подзапросы, поехали!; -)
Ждем ваших предложений!: -)
РЕДАКТИРОВАТЬ:
Я допустил серьезную ошибку в своем ОП, которая теперь исправлена и глубоко меняет то, что можно считать точным ответом.Ожидаемые результаты не были правильными.Мои самые скромные извинения.: - (
Идея такова: сопоставьте как можно больше по равенству КОДОВ, а затем рассмотрите только те, которые остались в этом первом алгоритме сопоставления, чтобы сопоставить их по индексу. Вот почему AAA, который неправильно ожидалсяINDEX-совпадение с BBB (которое уже CODE-сопоставляет с другим BBB), должно фактически INDEX-совпадать с другим элементом, не совпадающим с CODE, в этом случае DDD.