2014-09-04 4 views
1

У меня есть две таблицы, которые я пытаюсь объединить в определенном столбце (разделяемом между ними). Данные в этих столбцах должны представлять числа, но данные на самом деле являются символами, а некоторые из значений не являются числовыми (например, «2,3,4» или «n/a»). Я игнорирую строки с нечисловыми значениями этого столбца. Я подхожу столбцы как числовой в соединении, потому что «001» должен соответствовать «1», «01», «0001» и т.д. Внутренний соединив их работы, левое внешнее присоединение их не будет:Ошибка Odd LEFT JOIN

SELECT * 
FROM Table1 T1 
INNER JOIN Table2 T2 
    ON T1.ID NOT LIKE '%[^ 0-9]%' 
    AND T2.ID NOT LIKE '%[^ 0-9]%' 
    AND T1.ID + 0 = T2.ID + 0 
-- Success! 

SELECT * 
FROM Table1 T1 
LEFT JOIN Table2 T2 
    ON T1.ID NOT LIKE '%[^ 0-9]%' 
    AND T2.ID NOT LIKE '%[^ 0-9]%' 
    AND T1.ID + 0 = T2.ID + 0 
-- Conversion failed when converting the nvarchar value '2,3,4' to data type int. 

Почему я получаю ошибку на внешнем соединении, но не внутреннее соединение?

P.S .: Исправление данных не опция. Это не мои данные; Я не могу прикоснуться к нему. Мне нужно найти способ работать с ним.

EDIT: Я бегу SQL Server 2008 R2 RTM

+1

Так, чтобы быть понятным, вы получите сообщение об ошибке? Или вы не получаете данные, которые ожидаете? Если вы получаете сообщение об ошибке, какая ошибка? –

+0

Что должно делать 'T1.ID + 0 = T2.ID + 0'? Почему бы не просто «T1.ID = T2.ID»? – wdosanjos

+0

вы забыли «внешний» в своем запросе. SELECT * FROM Table1 T1 LEFT Outer JOIN Table2 T2 on ... –

ответ

2

SQL Server не гарантирует порядок, в котором будут оцениваться условия. В вашем случае T1.ID + 0 = T2.ID + 0 оценивается до NOT LIKE.

Пожалуйста, попробуйте следующее (SQL 2012 и выше):

SELECT * 
FROM Table1 T1 
LEFT JOIN Table2 T2 
    ON TRY_CAST(T1.ID AS int) = TRY_CAST(T2.ID AS int) 

SQL 2008:

SELECT * 
FROM (SELECT * FROM Table1 WHERE ID NOT LIKE '%[^ 0-9]%') T1 
LEFT JOIN (SELECT * FROM Table2 WHERE ID NOT LIKE '%[^ 0-9]%') T2 
    ON CAST(T1.ID AS INT) = CAST(T2.ID AS INT) 

Reference

+0

В моем фактическом запросе на обоих концах есть подстановочные знаки ('%'); Я не смог добавить их, когда написал этот пример. Теперь это исправлено. Я проверил свою версию, и я использую SQL Server 2008 :( –

+0

Спасибо за фактический ответ (заказ не гарантирован) и решение. Решение для SQL 2008 работает для моего приложения с добавлением 'OR ID NULL' в Table1). –

1

, что если вы попытаетесь это сделать, а? делает ли он то, что вы хотите?

SELECT * 
FROM Table1 T1 
LEFT JOIN Table2 T2 
    ON (isnumeric(T1.ID) = 1 
     AND isnumeric(T2.ID) = 1) 
     AND try_parse(T1.ID as int) + 0 = try_parse(T2.ID as int) + 0 
+0

ISNUMERIC делает оба запроса терпят неудачу, я думаю, потому что он считает, что запятая действительна. В любом случае, это, вероятно, сработало бы, но у меня нет доступа к TRY_PARSE. –