【问题标题】:using like in an inner join在内部连接中使用 like
【发布时间】:2011-04-28 15:33:42
【问题描述】:

我必须在两个数据库之间(在同一台服务器上)同步数据,并使用存储过程来实现这一点。

数据库 A 的 id 是 int,数据库 B 的 id 是 char(25) 并采用以下形式:Item。例如,如果 A.Id 为 42,则 B.Id 为 Item42

在查询加入两个数据库时,会发生最奇怪的行为:

SELECT A.Id, B.id
FROM A.dbo.table as A
LEFT OUTER JOIN B.dbo.table as B on (B.id like 'Item42')

按预期工作,但是

DECLARE @id nvarchar;    
SET @id = '42';

SELECT A.Id, B.id
FROM A.dbo.table as A
LEFT OUTER JOIN B.dbo.table as B on (B.id like 'Item' + @id)

在 B.Id 上返回 null。

为什么会这样?

【问题讨论】:

  • 此查询是否有效:SELECT A.Id, B.id FROM A.dbo.table as A LEFT OUTER JOIN B.dbo.table as B on (B.id like 'Item' + 42 ) ?

标签: sql sql-server


【解决方案1】:

我想你想要这样的东西:

select a.id, b.id
from A.dbo.table as a
left join B.dbo.table as b
  on b.id = 'Item' + convert(varchar, a.id)

否则,您实际上是在进行交叉连接,因为您没有在 B 的连接子句中引用 A。

【讨论】:

  • 您的回答让我发现了问题。我使用的是 nvarchar 而不是 varchar =$ silly me
【解决方案2】:

没有长度说明符的NVARCHAR 被视为NVARCHAR(1),它不能容纳42,并将其截断为4

DECLARE @id nvarchar;    
SET @id = '42';

SELECT  @id

--
4

@id指定更大的长度:

DECLARE @id NVARCHAR(20)

最终,您的查询应如下所示:

SELECT  A.Id, B.id
FROM    A.dbo.table as A
LEFT OUTER JOIN
        B.dbo.table as B
ON      B.id = 'Item' + CAST(a.id AS VARCHAR(20))

这比LIKE 好,因为相等运算符是可搜索的。

【讨论】:

  • 你说得对,但它仍然没有解决问题。
  • 编辑是对的。我不得不将它转换为 varchar 而不是 nvarchar
  • @Daniel:请张贴两个表中的相关记录,您认为应该返回。
  • 正如我所说,您的编辑是正确的。问题是我使用的是 nvarchar 或 varchar。我将@John Gibb 的回答标记为已接受,因为正是他的回答导致我遇到了问题。尽管如此,我还是给你们两个都投了赞成票
【解决方案3】:

你不应该这样做吗?:

SELECT A.Id, B.id
FROM A.dbo.table as A
LEFT OUTER JOIN B.dbo.table as B 
ON B.id = 'Item' + CAST(A.id AS VARCHAR(10))

如果不使用通配符 '%',为什么还要使用 LIKE?为什么要使用 id 为静态值的 JOIN

【讨论】:

  • 我使用 LIKE 因为数据库 B Id 比 Item 稍微复杂一些。它涉及另一个变量,实际上我正在这样做:比如'%,'+ convert(varchar,B.id)。我只是举一个更简洁的例子,这样很容易找到问题=)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 2017-07-01
  • 2011-07-10
  • 1970-01-01
  • 2017-08-30
  • 2018-10-20
相关资源
最近更新 更多