内部加入两列,其中一列具有单个拖尾字符

时间:2015-12-09 19:44:20

标签: sql sql-server inner-join

您好我是SQL新手,我有2个表,我正在尝试使用内部联接。

------------------------
First table: 
------------------------
ID-Number   CustomerName 


------------------------
Second table
------------------------
ID-Number   CustomerDevice

(ID with a single tailing character)

问题

在两个表的ID号上执行内部联接的最佳预处理方式是什么?

是否有一种方法可以删除inner-join命令中的尾随字符?

3 个答案:

答案 0 :(得分:1)

你没有太多选择。以下是表达逻辑的方法:

select . . .
from t1 join
     t2
     on t1.id like t2.id + '_';

不幸的是,这可能无法使用索引。 (另请注意,字符串连接的+是SQL Server特定的。)

您可以将查询重写为:

     on t1.id = left(t2.id, len(t2.id) - 1)

这应该可以使用t1(id)上的索引。

最好的方法是修复数据,因此您的ID类型相同,长度相同,并且具有正确声明的外键关系。 SQL Server中另一种可用的替代方法是计算列上的索引:

alter table t2 add realId as (left(id, len(id) - 1));
create index idx_t2_realId on t2(realId);

然后使用join编写realId逻辑。

答案 1 :(得分:0)

这会有用吗?

SELECT
ID-Number,
CustomerName,
CustomerDevice
FROM t1
INNER JOIN t2 on t1.ID-Number=LEFT(t2.ID-Number,LEN(t2.ID-Number)-1)

编辑:忘记1

答案 2 :(得分:0)

鉴于表客户有此列

ID_number int not null;

设备包含此列

ID_number varchar(15);

我们知道设备 ID_number ,如果它不是NULL,则始终等于某些客户 ID_number < / strong>附加一个字母,然后(SQL Server):

SELECT *
    FROM Customer c
    JOIN Device d
        ON c.ID_number = CAST(SUBSTRING(i.ID_number, 1, LEN(i.ID_number) - 1) AS int)

更强大的解决方案允许更多的数据可能性需要更多的防御性编码。您可能需要定义标量函数来处理客户 ID_number