【问题标题】:How to search on pairs of values in this SQL stored procedure如何在此 SQL 存储过程中搜索值对
【发布时间】:2010-11-24 17:56:25
【问题描述】:

我正在修改以下 SQL 过程/选择语句。我从之前的一个问题中得出这个,可以在这里引用:Need help with SQL query

当我没有条件检查多年的经验时,这非常有效,但我实际上想修改它,以便如果我有一个通过@csvList 的列表和另一个@csvYears 的列表,那么我可以将值配对 - 也就是说,我可以搜索具有 5 年经验的 Skill1 和具有 3 年经验的 Skill2

我可以在csvYears 的表上再做一次JOIN 吗? (SplitCSVStrings 函数返回一个表,并拆分 CSV 值列表)

看看现有的代码:

    ALTER PROCEDURE [dbo].[EmployeeQuerySkill]
    @csvList varchar(400),
    @years int,
    @fudge int,
    @hitAll int = 0
AS
BEGIN
  SELECT last_name, id, name, SUM(Experience ) AS 'YearsExperience'
  FROM 
  (
      SELECT e.last_name, e.id, s.name, CASE WHEN r.end_date ='01/01/1901' THEN MAX(datediff(YY,r.start_date, GETDATE())) ELSE MAX(datediff(YY,r.start_date, r.end_date)) END AS 'Experience'
      FROM employee as e
      INNER JOIN project AS p ON e.id = p.employee_id
      INNER JOIN role AS r ON p.id = r.project_id
      INNER JOIN role_skill AS rs ON rs.role_id = r.id
      INNER JOIN skill AS s ON s.id = rs.skill_id
      JOIN SplitCSVStrings(@csvList)            AS CSV ON CSV.val = s.name

     GROUP BY e.last_name, e.id, s.name, r.end_date
  )  table1    
  WHERE table1.Experience >= @years
  GROUP BY last_name, id, name

  END
END

如何修改它以允许我为每个技能搜索不同的条件? @csvList 以“C++、Java”的形式出现,我希望 @years"5, 3" 的形式出现,相应的搜索显示具有 5 年 C++ 经验和 3 年 Java 经验的人。

谢谢!

【问题讨论】:

    标签: sql sql-server-2005 select


    【解决方案1】:

    我认为您需要修改函数SplitCSVStrings 才能使其正常工作。哟应该使它返回的表有一个额外的列,指示 csv 中的位置。例如,如果参数是“C++,Java”,结果应该是:

    id val
    1  C++
    2  Java
    

    如果你这样做,那么你可以修改你的查询是这样的:

    ALTER PROCEDURE [dbo].[EmployeeQuerySkill]
        @csvList varchar(400),
        @years int,
        @fudge int,
        @hitAll int = 0
    AS
    BEGIN
      SELECT last_name, id, name, SUM(Experience ) AS 'YearsExperience'
      FROM 
      (
          SELECT e.last_name, e.id, s.name, CASE WHEN r.end_date ='01/01/1901' THEN MAX(datediff(YY,r.start_date, GETDATE())) ELSE MAX(datediff(YY,r.start_date, r.end_date)) END AS 'Experience', CSV2.val Years
          FROM employee as e
          INNER JOIN project AS p ON e.id = p.employee_id
          INNER JOIN role AS r ON p.id = r.project_id
          INNER JOIN role_skill AS rs ON rs.role_id = r.id
          INNER JOIN skill AS s ON s.id = rs.skill_id
          JOIN SplitCSVStrings(@csvList) AS CSV ON CSV.val = s.name
          LEFT JOIN SplitCSVStrings(@years) AS CSV2 ON CSV.id = CSV2.id
    
         GROUP BY e.last_name, e.id, s.name, r.end_date, CSV2.val
      )  table1    
      WHERE table1.Experience >= years
      GROUP BY last_name, id, name
    
      END
    END
    

    在任何情况下,您都应该注意@csvlist 和@years 中传递的参数是相同的。

    【讨论】:

    • 是否为此正确设置了分组?我将您的行更改为 CSV2.val 为“Years”,并将“Years”添加到 group by 中,但仍然无法正常工作
    • 你是对的,对不起,分组错误。我现在更正了它,所以它应该可以工作
    猜你喜欢
    • 2010-10-25
    • 1970-01-01
    • 2011-06-03
    • 2013-01-20
    • 2011-09-15
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多