MySQL ОСТАВИЛ JOIN .. ON .. ПРЕДЛОЖЕНИЕ

#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?