Sql查询和匹配字符串/数字

时间:2014-05-31 19:05:23

标签: sql sql-server string string-matching

我正在使用几张桌子。 Employee表(tblEmployee),Managers表(tblManager)和管理器日志表(tblLog)。在日志表中有大约10列。第一列是经理ID。还有另一列具有要转移的员工的名字,以及该员工应该去哪个部门。以下是该列的快照:

Bob- Dept: 7 Meg- Dept: 5 
Bob- Dept: 7 Meg- Dept: 5  
Bob- Dept: 7 Meg- Dept: 5 
Preston- Dept: 1 
Martin- Dept: MANG Sue- Dept: MANG Sarah - DEPT: 8 
Martin- Dept: MANG Sue- Dept: MANG Sarah - DEPT: 8
Martin- Dept: MANG Sue- Dept: MANG Sarah - DEPT: 8 
Isabel- Dept: 6 Mike- Dept: 5 
Isabel- Dept: 6 Mike- Dept: 5  
Dan- Dept: MANG
Dan- Dept: MANG 

如您所见,有重复的行。推荐Bob和Meg被转移的经理有3行作为他的ID。那是因为他在桌子上有3名员工,每个员工都有一排。我正在努力提取正在转移到管理层(MANG)或其他部门(#1-8)的员工。我有一个查询,它可以获取我需要的所有信息,但是它会将每个员工都记录在日志表中,它目前不会过滤掉额外的员工。所以说我要返回150行,实际上只有100个员工转移和50个其他员工因为不同的原因而在日志表中。

我试图提出一个查询,该查询采用员工的名字并检查它是否在列中,然后获取员工未来的部门编号(来自tblEmployee)并检查它是否与日志中的编号匹配柱。我查看了PARTINDEX和REGEX,但我不够熟练,无法提出可以达到预期效果的解决方案

1 个答案:

答案 0 :(得分:0)

就数据模型的细节而言,您的问题有点模糊。在尝试理解您的问题之后,我的建议是考虑重写您的数据模型,因为我个人认为在您想要计算此类查询时会有一些不足之处。

除此之外,我已经尝试根据您在问题中描述的内容猜测您的数据模型,并假设它是这样的:

CREATE TABLE tblLog(
    ManagerID int,
    log varchar(max)
 )

INSERT INTO tbllog values
(1, 'Bob- Dept: 7 Meg- Dept: 5'),
(1, 'Bob- Dept: 7 Meg- Dept: 5'),
(1, 'Bob- Dept: 7 Meg- Dept: 5'), 
(2, 'Preston- Dept: 1'), 
(3, 'Martin- Dept: MANG Sue- Dept: MANG Sarah - DEPT: 8'),
(3, 'Martin- Dept: MANG Sue- Dept: MANG Sarah - DEPT: 8'),
(3, 'Martin- Dept: MANG Sue- Dept: MANG Sarah - DEPT: 8'), 
(4, 'Isabel- Dept: 6 Mike- Dept: 5'), 
(4, 'Isabel- Dept: 6 Mike- Dept: 5'),  
(5, 'Dan- Dept: MANG'),
(5, 'Dan- Dept: MANG') 


CREATE TABLE tblEmployee(
    FirstName varchar(100)
)

INSERT INTO tblEmployee values
('Bob'), ('Meg'), ('Preston'), ('Martin'), ('Sue'), ('Sarah'), ('Isabel'), ('Mike'), ('Dan')

如果是这样,那么找到你想要的信息是相对微不足道的(尽管因为你存储数据的方式,计算效率低下)

DECLARE @vcDepartment VARCHAR(50) = 'MANG'


SELECT DISTINCT
    tblLog.ManagerID,
    tblEmployee.FirstName
FROM
    tblLog,
    tblEmployee
WHERE
    tblLog.Log like '%' + tblEmployee.FirstName + '- DEPT: ' + @vcDepartment + '%'
OR  tblLog.Log like '%' + tblEmployee.FirstName + ' - DEPT: ' + @vcDepartment + '%'

我已将答案放在一个sql小提琴中,以便您可以验证解决方案,并在需要时使用它:http://sqlfiddle.com/#!6/d22df/1/0

希望指出你正确的方向。