Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 несовпадение типов полей в объединении  [new]
голактеко_опасносте
Guest
Добрый день.
Не могу понять логику выполнения запроса.
Есть запрос

WITH ....,
veditems (nrec_material, nrec_dce, ei, kolvo, tm, prim, temp) AS
(
SELECT ..., T$PLISTTBL.F$NAME 
FROM
...
LEFT JOIN T$PARAMVOL ON T$PARAMVOL.F$COBJECT =  T$NORMAS.F$NREC AND T$PARAMVOL.F$BLOCK = 1
LEFT JOIN T$PLISTTBL ON T$PLISTTBL.F$NUMBER = T$PARAMVOL.F$VALUE#2# AND T$PLISTTBL.F$OWNER = 0x8063000000000001
)
SELECT * FROM veditems

таблицы T$PARAMVOL и T$PLISTTBL здесь связаны по полям разных типов - T$PLISTTBL.F$NUMBER тип int, T$PARAMVOL.F$VALUE#2# тип varchar (да, такая вот база данных). При этом запрос выше обрабатывается нормально и получает все данные, которые хочу получить, в том числе и в поле T$PLISTTBL.F$NAME.
Но стоит только добавить условие на выборку в SELECT * FROM veditems, например - WHERE temp = 'ОС', сразу же получаем ошибку преобразования типов:
Msg 245, Level 16, State 1, Line 5
Ошибка преобразования значения varchar "0.0000000000000" в тип данных int. При условии temp IS NULL запрос работает нормально. Если в исходной выборке заменить T$PLISTTBL.F$NAME на ISNULL(T$PLISTTBL.F$NAME, 'значение по умолчанию') - всё работает и с фильтром по этому полю.

Вот и возник вопрос - почему собственно так? Без WHERE запрос получает данные, с WHERE - ошибка преобразования типа (то, что приходится джоинить таблицы по полям разного типа оставим на совести разработчиков исходной базы). Хочу понять, в какой момент выполняется преобразование и почему оно не выполняется просто при объединении без условий (верней, как-то выполняется, данные-то получаются верные).
3 авг 12, 11:41    [12957204]     Ответить | Цитировать Сообщить модератору
 Re: несовпадение типов полей в объединении  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
меняете запрос - меняется план выполнения запроса
3 авг 12, 11:44    [12957227]     Ответить | Цитировать Сообщить модератору
 Re: несовпадение типов полей в объединении  [new]
голактеко_опасносте
Guest
HandKot,
у меня основной вопрос в общем-то в том, почему это работает без условий, а не почему не работает с условием.
То есть я могу предположить (и посмотреть в плане выполнения), что оптимизатор добавляет условие из WHERE в условия объединения таблиц из JOIN (T$PLISTTBL.F$NUMBER = T$PARAMVOL.F$VALUE#2#) и из-за этого запрос вылетает. Но по мне он должен вылетать изначально. Не вылетает потому, что left join и типа если не вышло соединить из-за преобразования типов - то и хрен бы с ним?
Было бы интересно и полезно мне что-нибудь по этому поводу почитать, если можете - посоветуйте.
3 авг 12, 11:54    [12957330]     Ответить | Цитировать Сообщить модератору
 Re: несовпадение типов полей в объединении  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37056
голактеко_опасносте
HandKot,
у меня основной вопрос в общем-то в том, почему это работает без условий, а не почему не работает с условием.
То есть я могу предположить (и посмотреть в плане выполнения), что оптимизатор добавляет условие из WHERE в условия объединения таблиц из JOIN (T$PLISTTBL.F$NUMBER = T$PARAMVOL.F$VALUE#2#) и из-за этого запрос вылетает. Но по мне он должен вылетать изначально. Не вылетает потому, что left join и типа если не вышло соединить из-за преобразования типов - то и хрен бы с ним?
Было бы интересно и полезно мне что-нибудь по этому поводу почитать, если можете - посоветуйте.
План смотрите. Там все видно, когда что считается и сравнивается.
3 авг 12, 12:06    [12957405]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить