Sql server 奇数左连接错误

Sql server 奇数左连接错误,sql-server,tsql,sql-server-2008-r2,Sql Server,Tsql,Sql Server 2008 R2,我有两个表,我正试图在一个特定的列上连接在一起(在这两个列之间共享)。这些列中的数据应该表示数字,但数据实际上是字符,并且一些值是非数字的(例如“2,3,4”或“n/a”)。我将忽略此列中具有非数值的行。我将列视为联接中的数字,因为“001”必须与“1”、“01”、“0001”等匹配。内部联接它们有效,外部联接它们无效: SELECT * FROM Table1 T1 INNER JOIN Table2 T2 ON T1.ID NOT LIKE '%[^ 0-9]%' AND T

我有两个表,我正试图在一个特定的列上连接在一起(在这两个列之间共享)。这些列中的数据应该表示数字,但数据实际上是字符,并且一些值是非数字的(例如“2,3,4”或“n/a”)。我将忽略此列中具有非数值的行。我将列视为联接中的数字,因为“001”必须与“1”、“01”、“0001”等匹配。内部联接它们有效,外部联接它们无效:

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.
为什么我在外部连接而不是内部连接上出错

注意:修复数据不是一个选项。这不是我的数据;我不能碰它。我得想个办法来对付它


编辑:我正在运行SQL Server 2008 R2 RTM

如果您改为尝试此操作会怎么样?它能满足你的需要吗

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

SQL Server不保证条件的求值顺序。在您的情况下,
T1.ID+0=T2.ID+0
将在
不相似
条件之前进行评估

请尝试以下操作(SQL 2012及以上版本):

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)

参考


因此,请澄清,您遇到了错误?或者你没有得到你想要的数据?如果您遇到错误,错误是什么?应该怎么做?为什么不干脆
T1.ID=T2.ID
?您在查询中忘记了“outer”。在…@BillGregg上从表1 T1左外连接表2 T2中选择*我添加了错误消息@wdosanjos将零添加到列中会将其转换为int。否则,前导零的数目不同会阻止列匹配@
tsql
中不需要BehrouzBakhtiari
OUTER
。它隐含在
[LEFT | FULL | RIGHT]JOIN
()中,在我的实际查询中,两端都有通配符(
%
);我在编写示例时没有添加它们。现在修好了。我检查了我的版本,我正在使用SQL Server 2008:(感谢您的实际答案(订单不保证)和解决方案。您的SQL 2008解决方案适用于我的应用程序,在表1中添加了
或ID IS NULL
)。ISNUMERIC使两个查询都失败,我想是因为它认为逗号是有效的。无论如何,这可能会奏效,但我没有权限尝试解析。
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)