在argument1上使用argument2连接两个表

时间:2013-05-07 13:25:34

标签: sql sql-server

TABLE_A包含NVARCHAR(200) NOT NULLName。它的字段由公司名称后跟下划线并以公司ID结尾,例如:

  

MYCOMPANY_102

TABLE_B的PK是名为INT NOT NULL的{​​{1}}列,其中包含以下内容: CompanyID

我的查询,内部连接这两个表,其中一个参数以另一个结束,不产生任何结果。如果有人想知道显而易见的事:是的,有匹配的记录。

102

欢迎任何更正和洞察我的查询无法解决的原因。

编辑:公司名称可以在任何地方包含数字和/或下划线,我只想锁定可能最后出现的下划线,然后是任意自然的int。可能是_1,对于我所知道的所有可能是_205952。数字后缀

中没有前导零

5 个答案:

答案 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中使用nvarcharconvert()时,总是包含长度。这不会影响你。

我认为你在这种比较中会更好:

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))

SQL-Fiddle

答案 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]