Microsoft SQL查询帮助根据模板记录插入记录。 (员工/工作)

时间:2016-09-22 18:31:51

标签: sql tsql

我不是专家,但我一直在试图找出实现目标的最佳方法。 问题:

员工表[员工]和允许的工作代码表[EMPTRANSRATES]两个表都有一个名为" filekey"的列。它是一对多的关系。

我有几个模板员工,其中包含" IDNUM"以" T"开头许多员工都带着" IDNUM"这只是数字。这些员工还有一个名为" WG1"的船员标识符。我需要在[EMPTRANSRATES]中插入模板员工的[EMPTRANSRATES]记录的所有记录,其中任何[EMPLOYEE]的文件密钥与匹配的" WG1"。

建议的解决方案:

使用游标构建具有特定" WG1"的员工的文件密钥列表。并在光标中选择[EMPTRANSRATES]表。 - 我不喜欢这个解决方案,因为我必须为每个不同的WG1制作一个。

问题1.我可以将光标放在光标中吗?例如,生成每个不同的WG1 temmplate员工的列表,并在其中选择具有匹配WG1的所有员工文件密钥,最后为每个插入匹配使用每个员工的唯一文件密钥进行转换。

问题2.有更好的方法吗?

提前致谢!!!

布拉德

修改

Example of data
    [EMPLOYEES]
    |FILEKEY|FNAME|LNAME|IDNUM|WG1|
    1,Brad,Williams,1234,2
    2,Template,Template,T2,2
    3,Template.Template,T17,17
    4,Stan,Smith,0531,2
    5,Sally,Smith,9876,17

    [EMPTRANSRATES]
    |FILEKEY|JOB1|JOB2|
    2,1,0
    2,1,1
    2,2,0
    2,0,3
    3,1,1
    3,0,7

Expected results of script
    [EMPLOYEES]
    |FILEKEY|FNAME|LNAME|IDNUM|WG1|
    1,Brad,Williams,1234,2
    2,Template1,Template1,T2,2
    3,Template2.Template2,T17,17
    4,Stan,Smith,0531,2
    5,Sally,Smith,9876,17

    [EMPTRANSRATES]
    |FILEKEY|JOB1|JOB2|
    2,1,0
    2,1,1
    2,2,0
    2,0,3
    3,1,1
    3,0,7
    1,1,0
    1,1,1
    1,2,0
    1,0,3
    4,1,0
    4,1,1
    4,2,0
    4,0,3
    5,1,1
    5,0,7

由于filekey 1和filekey 4与template1员工的WG1相同,因此在从匹配模板员工复制的emptransrats表中为其文件密钥创建了新记录。

因为filekey 5与template2员工的WG1相同,所以为从匹配模板员工复制的emptransrats表中的文件密钥创建了新记录。

再次感谢。

2 个答案:

答案 0 :(得分:0)

通过编辑,这就是我所理解的(在集合中思考)

  1. 从员工中选择所有模板(表示为IDNUM以“T”开头)。

  2. 从员工表中选择与这些模板具有匹配WG1编号的所有员工(在没有“T”的情况下表示为IDNUM)。

  3. 将符合模板但与员工ID匹配的值插入EMPTRANSRATES。

  4. 现在我们理解它作为集合上的操作让我们一步一步地采取它。

    选择所有模板

    SELECT *
    FROM EMPLOYEES AS T -- T stands for Template
    WHERE T.IDNUM LIKE 'T%'
    

    选择匹配

    的员工
    SELECT *
    FROM EMPLOYEES E
    JOIN EMPLOYEES T ON E.WG1 = T.WG1 AND T.IDNUM LIKE 'T%'
    WHERE NOT E.IDNUM LIKE 'T%'
    

    现在我们可以使用它来插入,我们需要来自另一个表的值,只需加入它:

    SELECT *
    FROM EMPLOYEES E
    JOIN EMPLOYEES T ON E.WG1 = T.WG1 AND T.IDNUM LIKE 'T%'
    JOIN EMPTRANSRATES R ON T.FILEKEY = R.FILEKEY
    WHERE NOT E.IDNUM LIKE 'T%'
    

    完成后,只需添加插入内容:

    INSERT INTO EMPTRANSRATES (FILEKEY, JOB1, JOB2)
      SELECT E.FILEKEY, R.JOB1, R.JOB2
      FROM EMPLOYEES E
      JOIN EMPLOYEES T ON E.WG1 = T.WG1 AND T.IDNUM LIKE 'T%'
      JOIN EMPTRANSRATES R ON T.FILEKEY = R.FILEKEY
      WHERE NOT E.IDNUM LIKE 'T%'
    
      

    请不要只是复制答案并运行它。 相反运行每一步,确保您了解它的作用。否则,我很难回答这个问题并以一种明确的方式进行,这对我们两个人来说都是浪费时间。这是相当基本的SQL,你应该能够弄明白 - 我希望我解释它的方式让你“在SQL中思考”。 不要使用游标!

    -------

    很难从你的问题中看出来,但我希望你想要的东西看起来像这样:

    INSERT INTO EMPTRANSRATE ({Columns to populate})
      SELECT DISTINCT {What you need to insert}
      FROM EMPLOYEES
      WHERE IDNUM LIKE 'T%' 
        AND CREW_IDENTIFIER = 'WG1'
    

    如果您担心EMPTRANSRATE中已经存在列,您可以像这样修复它(假设列需要是A和B)

    INSERT INTO EMPTRANSRATE (A, B)
      SELECT DISTINCT A, B
      FROM EMPLOYEES
      WHERE IDNUM LIKE 'T%' 
        AND CREW_IDENTIFIER = 'WG1'
        AND (A, B) NOT IN
            (SELECT A, B FROM EMPTRANSRATE)
    

答案 1 :(得分:0)

这是我的代码的最终工作版本并且运行良好。谢谢所有帮助过的人!

INSERT INTO EMPTRANRATES (FILEKEY, FLAGS, WG1,WG2,WG3, RATE,EFFDATE,DTTMSTAMP,WG4,WG5,WG6,WG7)
  SELECT Distinct E.FILEKEY, R.FLAGS, r.WG1,r.WG2,r.WG3, r.RATE,r.EFFDATE,r.DTTMSTAMP,r.WG4,r.WG5,r.WG6,r.WG7
  FROM EMPLOYEES E
  JOIN EMPLOYEES T ON E.WG1 = T.WG1 AND T.IDNUM LIKE 'T%'
  JOIN EMPTRANRATES R ON T.FILEKEY = R.FILEKEY
  WHERE NOT E.IDNUM LIKE 'T%'
  AND not exists
    (Select FILEKEY, FLAGS, WG1,WG2,WG3, RATE,EFFDATE,DTTMSTAMP,WG4,WG5,WG6,WG7 from EMPTRANRATES)

最后我使用不存在,因为我遇到了错误。

Msg 4145, Level 15, State 1, Line 7
An expression of non-boolean type specified in a context where a condition is expected, near ','.

我在更改之前使用的代码是:

INSERT INTO EMPTRANRATES (FILEKEY, FLAGS, WG1,WG2,WG3, RATE,EFFDATE,DTTMSTAMP,WG4,WG5,WG6,WG7)
  SELECT Distinct E.FILEKEY, R.FLAGS, r.WG1,r.WG2,r.WG3, r.RATE,r.EFFDATE,r.DTTMSTAMP,r.WG4,r.WG5,r.WG6,r.WG7
  FROM EMPLOYEES E
  JOIN EMPLOYEES T ON E.WG1 = T.WG1 AND T.IDNUM LIKE 'T%'
  JOIN EMPTRANRATES R ON T.FILEKEY = R.FILEKEY
  WHERE NOT E.IDNUM LIKE 'T%'
  AND (E.FILEKEY, R.FLAGS, r.WG1,r.WG2,r.WG3, r.RATE,r.EFFDATE,r.DTTMSTAMP,r.WG4,r.WG5,r.WG6,r.WG7) not in
    (Select FILEKEY, FLAGS, WG1,WG2,WG3, RATE,EFFDATE,DTTMSTAMP,WG4,WG5,WG6,WG7 from EMPTRANRATES)

该代码抛出标记但未处理。我不知道为什么,但它适用于NOT EXISTS

再次感谢大家!