Sql内连接删除id前缀

时间:2018-03-12 12:13:19

标签: sql sql-server

我有两个表 tblEsslAttendance tblEnquiry 在tblDevicemember中生成111并且tblMember id生成JE-111,我想加入那个带有这个id base的两个表

我的表 tblEsslAttendance 是:

sed -r "/^>/R file2" file1 | sed -r "/>/d;/^[^#]/s/(.*)/> \1/"

我的表 tblEnquiry

 EmpDeviceCode | EmpCode | LogDate
 -----------------------------------
 111           |   111   |2017-02-03

我尝试解决此问题,我的查询是:

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 

2 个答案:

答案 0 :(得分:2)

使用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()

重复表达,

相同的查找表也很有用

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

答案 1 :(得分:1)

您不能在同一级别的查询中使用select中的列别名 - 包括on子句。

一种方法将逻辑放在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;