TABLE_A包含NVARCHAR(200) NOT NULL
列Name
。它的字段由公司名称后跟下划线并以公司ID结尾,例如:
MYCOMPANY_102
TABLE_B的PK是名为INT NOT NULL
的{{1}}列,其中包含以下内容: CompanyID
我的查询,内部连接这两个表,其中一个参数以另一个结束,不产生任何结果。如果有人想知道显而易见的事:是的,有匹配的记录。
102
欢迎任何更正和洞察我的查询无法解决的原因。
编辑:公司名称可以在任何地方包含数字和/或下划线,我只想锁定可能最后出现的下划线,然后是任意自然的int。可能是_1,对于我所知道的所有可能是_205952。数字后缀
中没有前导零答案 0 :(得分:2)
您需要做的就是从名称中取出该ID,然后像这里一样加入。
SELECT * FROM [SERVER1].[dbo].[TABLE_A] a
INNER JOIN [SERVER2].[dbo].[TABLE_B] b
cast(right(a.NAME, len(a.NAME)-charindex('_',A.NAME)) as int) = b.CompanyID
答案 1 :(得分:2)
您的问题可能是公司名称上的空白。 documentation指出:
LIKE支持ASCII模式匹配和Unicode模式匹配。 当所有参数(match_expression,pattern和escape_character, 如果存在)是ASCII字符数据类型,ASCII模式匹配是 执行。如果任何一个参数都是Unicode数据类型,则全部 参数转换为Unicode,Unicode模式匹配 执行。使用Unicode数据(nchar或nvarchar数据类型)时 与LIKE一样,尾随空白很重要;但是,对于非Unicode 数据,尾随空白并不重要。 Unicode LIKE兼容 符合ISO标准。 ASCII LIKE与早期版本兼容 SQL Server。
这只是一种可能性。请注意,当您在varchar
中使用nvarchar
或convert()
时,总是包含长度。这不会影响你。
我认为你在这种比较中会更好:
cast(SUBSTRING(a.name, charindex('_', a.name)+1, LEN(a.name)) as int) = b.CompanyId
通过在CompanyId
上使用等同连接,您可以在该列上使用索引。
答案 2 :(得分:1)
Like '%[_]' + Cast(b.CompanyID as Varchar(100))
答案 3 :(得分:0)
这可能会有所帮助:
SELECT * FROM [SERVER1].[dbo].[TABLE_A] a
INNER JOIN [SERVER2].[dbo].[TABLE_B] b
ON a.Name LIKE N'%[_]' + CONVERT(NVARCHAR, b.CompanyID)
我已经测试了你的代码,它对我来说非常合适。可能的唯一原因是没有匹配的记录。
答案 4 :(得分:0)
有些东西可能不像您所认为的那样,因为此页面上的大多数代码(包括您的代码)应该可以使用,或者至少返回某些内容。
我建议将这些表选择到本地临时表中(允许您检查数据类型/长度),即使您认为不需要,也可以运行ltrim(rtrim(...))
,使用N
标记文字作为unicode,明确设置字符串的宽度等。任何可以提高简单性或安全性的东西都可以帮助您找到问题。
头发拉拔器通常以头版拍打结束。
SELECT Name INTO #TABLE_A FROM [SERVER1].[dbo].[TABLE_A];
SELECT CompanyID INTO #TABLE_B FROM [SERVER1].[dbo].[TABLE_B];
-- Now you can check to see that the columns above are what you believe,
-- and then run your select or any of the selects that have been offered.
SELECT a.Name, b.CompanyID
FROM #TABLE_A AS a
INNER JOIN #TABLE_B AS b
ON LTRIM(RTRIM(a.Name)) LIKE N'%[_]' + CAST(b.CompanyID AS NVARCHAR(11))
此外,[SERVER1].[dbo].[TABLE_A]
对4-part naming看起来很奇怪。您的意思是[DB1].[dbo].[TABLE_A]
还是[SERVER1].[DB1].[dbo].[TABLE_A]
?