【问题标题】:Sql query and matching strings/numbersSql 查询和匹配字符串/数字
【发布时间】:2014-07-21 08:22:11
【问题描述】:

我正在处理几张桌子。员工表 (tblEmployee)、经理表 (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 和正则表达式,但我不够熟练,无法提出可以达到预期结果的解决方案

【问题讨论】:

  • 请显示表格的布局。在你的布局中很难理解什么是列名,什么是列值。
  • 如果您无法提出查询,那么至少显示每个表的示例数据以及基于此数据的所需结果。

标签: sql sql-server string string-matching


【解决方案1】:

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

除了咆哮,我试图根据您在问题中描述的内容猜测您的数据模型,并假设它是这样的:

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 fiddle 中,因此您可以验证解决方案并根据需要使用它:http://sqlfiddle.com/#!6/d22df/1/0

希望这会为您指明正确的方向。

【讨论】:

  • 当我实现它时我会告诉你这是否成功,但它看起来肯定会成功
  • 工作得很好!,我想像这样添加查询更快:CHARINDEX(tblEmployee.FirstName+ ' - DEPT: ' + @vcDepartment, Log) > 0LIKE 花了 4 秒,CHARINDEX 不到一秒。而且似乎添加全文索引并使用包含会更快
  • @user3685738 这很有趣。出于兴趣,如果您运行命令“set statistics io on”,每种方式报告的统计信息是什么?如果您在运行另一种方式后运行一种方式,那么由于 sql server 缓存事物的方式,第二种方式可能运行得更快。如果您想查看查询的实际行为,请执行a checkpoint and issue a dbcc dropcleanbuffers command.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
相关资源
最近更新 更多