删除id前缀的Sql内部联接
在tblDevicemember id generate 111和tblMember id generate JE-111中,我有两个表TBlessLatenance和tblEnquiry,我想用这个id基连接这两个表 我的表格t LessLatenance为:删除id前缀的Sql内部联接,sql,sql-server,Sql,Sql Server,在tblDevicemember id generate 111和tblMember id generate JE-111中,我有两个表TBlessLatenance和tblEnquiry,我想用这个id基连接这两个表 我的表格t LessLatenance为: EmpDeviceCode | EmpCode | LogDate ----------------------------------- 111 | 111 |2017-02-03 我的桌子tblE
EmpDeviceCode | EmpCode | LogDate
-----------------------------------
111 | 111 |2017-02-03
我的桌子tblEnquiry是
EnquiryID | FirstName | Gender
-----------------------------
JE-111 | AAAA | Male
我试图解决这个问题,我的问题是:
SELECT l.EmpDeviceCode,(RIGHT(ah.EnquiryID, LEN(ah.EnquiryID) - 3))
AS tempnewId,
ah.* FROM tblEnquiry ah INNER JOIN tblEsslAttendance
l ON l.EmpCode = ah.tempnewId
你能帮我吗
我想要这样的输出:
EmpDeviceCode | EmpCode | LogDate |EnquiryID |FirstName | Gender
------------------------------------------------------------------
111 | 111 |2017-02-03|JE-111 | AAAAA | Male
不能在同一级别的查询中使用
select
中的列别名,包括on
子句
一种方法将逻辑放在上的中:
SELECT l.EmpDeviceCode,
(RIGHT(ah.EnquiryID, LEN(ah.EnquiryID) - 3)) AS tempnewId,
ah.*
FROM tblEnquiry ah INNER JOIN
tblEsslAttendance l
ON l.EmpCode = (RIGHT(ah.EnquiryID, LEN(ah.EnquiryID) - 3));
如果不想重复表达式,可以使用子查询、CTE或横向联接:
SELECT l.EmpDeviceCode, v.tempnewId,
ah.*
FROM tblEsslAttendance l CROSS APPLY
(VALUES (RIGHT(ah.EnquiryID, LEN(ah.EnquiryID) - 3) ) v(tempnewId)
tblEnquiry ah
ON l.EmpCode = v.tempnewid;
使用substring()
和charindex()
函数仅获取id
SELECT * FROM tblDeviceMember d
INNER JOIN tblMember m ON
substring(m.EnquiryID, charindex('-', m.EnquiryID)+1, len(m.EnquiryID)) = d.EmpCode
如果您不想通过SUBSTRING()
你的设计在这里看起来不是特别好。如果您的inquiryID
应该以这种方式链接到EmpCode
,那么tblEnquiry中可能会有一个EmpCode
作为外键
SELECT * FROM (
SELECT *,
substring(m.EnquiryID, charindex('-', m.EnquiryID)+1, len(m.EnquiryID)) Id
FROM tblMember
) m INNER JOIN tblDeviceMember d ON d.EmpCode = m.Id