您好我是SQL新手,我有2个表,我正在尝试使用内部联接。
------------------------
First table:
------------------------
ID-Number CustomerName
------------------------
Second table
------------------------
ID-Number CustomerDevice
(ID with a single tailing character)
问题
在两个表的ID号上执行内部联接的最佳预处理方式是什么?
是否有一种方法可以删除inner-join命令中的尾随字符?
答案 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 。