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