我不是专家,但我一直在试图找出实现目标的最佳方法。 问题:
员工表[员工]和允许的工作代码表[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表中的文件密钥创建了新记录。
再次感谢。
答案 0 :(得分:0)
通过编辑,这就是我所理解的(在集合中思考)
从员工中选择所有模板(表示为IDNUM以“T”开头)。
从员工表中选择与这些模板具有匹配WG1编号的所有员工(在没有“T”的情况下表示为IDNUM)。
将符合模板但与员工ID匹配的值插入EMPTRANSRATES。
现在我们理解它作为集合上的操作让我们一步一步地采取它。
选择所有模板
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
再次感谢大家!