#mysql #sql #db2
#mysql #sql #db2
Вопрос:
В настоящее время я переношу базу данных MySQL на другую СУБД. Я столкнулся со следующим запросом со следующей структурой.
SELECT ... FROM table1 AS tb1
LEFT JOIN Table2 AS tb2
ON tb1.x = tb2.x
AND tb2.y = 2 AND tb2.z = 3 ...
Моя целевая СУБД (DB2) «И tb2.y = 2 И tb2.z = 3» не допускает следующую структуру, поэтому я перенес ее в предложение WHERE. К сожалению, после его перемещения запрос, похоже, не возвращает те же строки из MySQL.
Комментарии:
1. Звучит больше как ошибка в вашем коде, чем что-либо еще. Может быть, реальный запрос мог бы помочь?
Ответ №1:
Во внешнем соединении при перемещении предикатов из ON
предложения в WHERE
предложение вы должны разрешить записи, в которых объединение не приводит к совпадению, и, следовательно, все столбцы из внешней таблицы будут NULL
.
У меня нет опыта работы с DB2, поэтому могут быть другие тонкости, о которых я не в курсе, но именно так я бы переписал запрос. Проверка на NULL
в столбце join является прямым показателем того, найдено ли соединение соответствие.
SELECT ... FROM table1 AS tb1
LEFT JOIN Table2 AS tb2
ON tb1.x = tb2.x
WHERE tb2.x IS NULL
OR (tb2.y = 2 AND tb2.z = 3)
Ответ №2:
Попробуйте это:
SELECT ...
FROM table1 AS tb1 LEFT JOIN Table2 AS tb2
ON tb1.x = tb2.x ,
tb2.y = 2 ,
tb2.z = 3 ...
Ответ №3:
Вы пробовали преобразовать его в RIGHT JOIN
?
SELECT ...
FROM Table2 AS tb2
RIGHT JOIN ON table1 AS tb1 tb1.x = tb2.x
WHERE tb2.y = 2 AND tb2.z = 3 ...
Ответ №4:
Я думаю, DB2 не допускает псевдоним таблицы с as
(но у меня сейчас нет DB2 под рукой)
Попробуйте
SELECT ...
FROM table1 tb1
LEFT JOIN Table2 tb2 ON tb1.x = tb2.x AND tb2.y = 2 AND tb2.z = 3
(Обратите внимание на пропуск as
после имен таблиц)
Редактировать: я только что проверил руководство DB2, и AS кажется действительным ….
(Но я пока оставлю этот пост)
Ответ №5:
очевидно, DB2 будет использовать только имена столбцов при сравнениях. Возможно, вы могли бы каким-то образом искусственно создать столбцы, которые имеют эти значения в таблице объединения? Вы получаете ошибку -338?