我们开始维护一个使用SQL Server的新项目,并且在某些表中存在一些与数据有关的问题,如下所述。有两个表格Employee
和Pass
和Pass
表格保留每个Employee
的进出。当FK字段为NULL时,使用索引来连接两个表
员工
|| ID || Name || CardNo ||
======================================
|| 1 || John || 101 ||
|| 2 || Christof || 102 ||
|| 3 || Jurgen || 103 ||
|| 4 || Jose || 104 ||
|| 5 || Mary || 105 ||
通
|| ID || EmployeeID || CardNo ||
======================================
|| 1 || NULL || 101 ||
|| 2 || NULL || 105 ||
|| 3 || NULL || 103 ||
|| 4 || NULL || 101 ||
|| 5 || NULL || 102 ||
|| 6 || NULL || 104 ||
|| 7 || NULL || 104 ||
|| 8 || NULL || 103 ||
|| 9 || NULL || 105 ||
|| 10 || NULL || 101 ||
在另一方面,作为Pass
表的EmployeeID
栏是空的每一个传球,我们必须使用CardNo
列为了加入两张表。
但是,如下所示使用JOIN
子句会导致查询执行更多时间,我认为可能有更好的方法,使用索引等代替PK来优化查询。我们已尝试创建索引,但无法创建CardNo
列。
请您澄清我们如何解决问题?谢谢...
SELECT *
FROM Pass p
LEFT JOIN Employee e ON RIGHT(e.CardNo, 8) = RIGHT(p.CardNo, 8) --I have to trim card no as the digit sizes are different
更新: 我试着应用以下脚本,但只有这部分工作:
alter table Pass add cardno8 as RIGHT(CardNo, 8);
alter table Employee add cardno8 as RIGHT(CardNo, 8);
这部分给出了错误:“列cardno8“表“通行证”的类型对于用作索引中的关键列无效。“
create index idx_tEvent_cardno8 ON Pass(cardno8);
create index idx_tEmployee_cardno8 ON Employee (cardno8);
任何想法?
“我们试图创建索引,但不能创建CardNo场”为什么不?你有错误吗?我看不出有什么明显的理由,你不能创建这样的索引。 –
“我没有修剪卡作为数字大小不同” - 'pass.cardno'不等于对应的'employee.cardno'?你能举个例子吗? –
Unfortunatela卡号码被保存到员工11位数字,同时保存10位数字以传递表格前导零。出于这个原因,我不得不采取卡号的最后8位数字。 – hexadecimal