2016-11-28 5 views
0

Я пытаюсь соединить две таблицы на SQL сервере 2008.Регистрация не работает на двух одинаковых полях

select * 
from TABLE1 a 
left join TABLE2 b 
on a.cont_id = b.cont_id 

Тем не менее, не может подключиться любой из данных.

a.cont_id имеет NVARCHAR (255) тип и b.cont_id является VARCHAR (80). Использование CAST никак не помогло.

Как a.cont_id состоит только из числовых данных, сначала я использовал тип float и integer и прикладную функцию отбрасывания, но это ничего не решило.

Я проверил свои VARBINARY коды, используя следующий запрос

select cont_id, CAST(cont_id AS varbinary) AS BinaryCode 
from Table1 
where cont_id = '53126124' 

select cont_id, CAST(cont_id AS varbinary) AS BinaryCode 
from Table2 
where cont_id = '53126124' 

и я получил эти два результата

cont_id  BinaryCode 
53126124 0x4189551F60000000 


cont_id  BinaryCode 
53126124 0x3533313236313234 

еще одна информация - Таблица 1 импортируется из документа первенствовать, который был создан в соседняя страна (Чешская Республика).

Что касается исходных таблиц, вот пример, если это помогает.

cont_id C1  C2 C3 
53126124 3  31 510 
175553321 5  16  510 

И

dt  cont_id D1 D2 
201610 53126124 0 0 
201610 175553321 41 520 

У вас есть какие-либо идеи, как бороться с этим?

+0

Как они выглядят в их обычном формате? – sagi

+2

Почему цифровые данные хранятся как varchars и nVarchars? –

+0

Возможно, у вас есть пробелы? 'on trim (a.con_id) = trim (b.con_id)', если нет, то, возможно, других не отображаемых символов, вы можете попытаться сделать len на обоих для одного ID и посмотреть, возвращает ли len то же значение, моя догадка не. – xQbert

ответ

0

Хорошо, я думаю, что у меня есть это:

Это

SELECT CAST(CAST(53126124 AS FLOAT) AS VARBINARY) 

приводит 0x4189551F60000000, в то время как это

SELECT CAST('53126124' AS varbinary) 

приводит 0x3533313236313234, а в этом

SELECT CAST(53126124 AS varbinary) 

возвращается с 0x032AA3EC.

Первое значение представляет собой двоичное представление FLOAT, второе из VARCHAR и последнее из INT.

Очевидно, что это НЕ ИСХОДЯЕТСЯ VARCHAR!

типа Float, как правило, unprecise, может быть крошечная значение как 1,0000000001 или 0.999999998, который считается 1, но не равны.

Вы можете попробовать с этим:

select * 
from TABLE1 a 
left join TABLE2 b 
on CAST(ROUND(a.cont_id,0) AS INT) = CAST(ROUND(b.cont_id,0) AS INT) 
+0

Спасибо. Это, наконец, дает мне тот же двоичный код для обоих из них. Что касается проблемы типа - я проверил тип, используя этот запрос SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Table1' , и это действительно varchar. Но это, вероятно, еще одна тема и не важна сейчас, так как вам все равно удалось ее решить. – MathFan

 Смежные вопросы

  • Нет связанных вопросов^_^