MySQL оставил присоединиться - PullRequest
0 голосов
/ 03 мая 2011

В настоящее время я портирую базу данных 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) "AND tb2.y = 2 AND tb2.z = 3" не позволяет следующую структуру, поэтому я переместил ее вГДЕ оговорка.К сожалению, после его перемещения запрос, похоже, не возвращает те же строки из MySQL.

Ответы [ 5 ]

2 голосов
/ 03 мая 2011

Во внешнем объединении при перемещении предикатов из предложения ON в предложение WHERE необходимо разрешить записи, в которых объединение не дает совпадений, и поэтому все столбцы из внешней таблицы будут иметь значение NULL .

У меня нет опыта работы с DB2, поэтому могут быть другие тонкости, о которых я не знаю, но именно так я бы переписал запрос. Проверка на NULL в столбце соединения является прямым индикатором того, было ли соединение найдено совпадением.

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)
1 голос
/ 03 мая 2011

Попробуйте это:

SELECT ... 
    FROM table1 AS tb1 LEFT JOIN Table2 AS tb2 
        ON tb1.x = tb2.x ,
        tb2.y = 2 ,
        tb2.z = 3 ... 
0 голосов
/ 03 мая 2011

очевидно, DB2 будет использовать только имена столбцов в сравнениях. Возможно, вы могли бы каким-то образом искусственно создать столбцы, которые имеют эти значения в соединительной таблице? Вы получаете ошибку -338?

0 голосов
/ 03 мая 2011

Я думаю, что 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, кажется, действителен ....(Но я пока оставлю пост)

0 голосов
/ 03 мая 2011

Вы пытались преобразовать его в 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 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...