sql server—如何使用insert查询将数据从一个sql表插入到另一个表

2mbi3lxu  于 2021-08-01  发布在  Java
关注(0)|答案(2)|浏览(441)

这是我的第一张table:

这是我的第二张table:

我想创造一个 INSERT 查询,以便第一个表中结果为“y”的任何列都将插入到第二个表中,但case语句插入除“y”以外的其他值时遇到了问题。
因此,在第一个表中,如果一条记录的slp\u c、sw\u c和其他\u c的值为“y”,那么在插入后的第二个表中,discipline1\u c='slp',discipline2='sw',discipline3\u c='oth'。如何编写case语句以使值正确插入到第二个表中?

  1. INSERT INTO [dbo].[tb_cdsa_eligibility] ([uniqueid_c], [Discipline1_c],[Discipline2_c], [Discipline3_c])
  2. SELECT
  3. [uniqueid_c],
  4. -- this one is going into Discipline1
  5. CASE
  6. WHEN [slp_c] = 'Y' THEN 'SLP'
  7. WHEN [ot_c] = 'Y' THEN 'OT'
  8. WHEN [SpecEd_c] = 'Y' THEN 'SE'
  9. WHEN [medical_c] = 'Y' THEN 'MED'
  10. WHEN [pt_c] = 'Y' THEN 'PT'
  11. WHEN [sw_c] = 'Y' THEN 'SW'
  12. WHEN [psych_c] = 'Y' THEN 'PSY'
  13. WHEN [other_c] = 'Y' THEN 'OTH'
  14. ELSE NULL
  15. END,
  16. -- this one is going into Discipline2
  17. CASE
  18. WHEN [slp_c] = 'Y' THEN 'SLP'
  19. WHEN [ot_c] = 'Y' THEN 'OT'
  20. WHEN [SpecEd_c] = 'Y' THEN 'SE'
  21. WHEN [medical_c] = 'Y' THEN 'MED'
  22. WHEN [pt_c] = 'Y' THEN 'PT'
  23. WHEN [sw_c] = 'Y' THEN 'SW'
  24. WHEN [psych_c] = 'Y' THEN 'PSY'
  25. WHEN [other_c] = 'Y' THEN 'OTH'
  26. ELSE NULL
  27. END,
  28. -- this one is going into Discipline3
  29. CASE
  30. WHEN [slp_c] = 'Y' THEN 'SLP'
  31. WHEN [ot_c] = 'Y' THEN 'OT'
  32. WHEN [SpecEd_c] = 'Y' THEN 'SE'
  33. WHEN [medical_c] = 'Y' THEN 'MED'
  34. WHEN [pt_c] = 'Y' THEN 'PT'
  35. WHEN [sw_c] = 'Y' THEN 'SW'
  36. WHEN [psych_c] = 'Y' THEN 'PSY'
  37. WHEN [other_c] = 'Y' THEN 'OTH'
  38. ELSE NULL
  39. END
  40. FROM
  41. [cd].[tb_cdsa_eligibility]
oipij1gg

oipij1gg1#

您需要将列转换为行,然后再转换回列。这似乎是一个很好的例子 PIVOT ```
SELECT
uniqueid_c,
[1] AS Discipline1_c,
[2] AS Discipline2_c,
[3] AS Discipline3_c
FROM @tb_cdsa_eligibility
OUTER APPLY (

  1. SELECT [1], [2], [3] FROM (
  2. SELECT ROW_NUMBER() OVER (ORDER BY pos) AS position, val FROM (
  3. SELECT 1 pos, CASE WHEN slp_c = 'Y' THEN 'SLP' ELSE NULL END val
  4. UNION ALL SELECT 2 pos, CASE WHEN ot_c = 'Y' THEN 'OT' ELSE NULL END val
  5. UNION ALL SELECT 3 pos, CASE WHEN SpecEd_c = 'Y' THEN 'SE' ELSE NULL END val
  6. UNION ALL SELECT 4 pos, CASE WHEN medical_c = 'Y' THEN 'MED' ELSE NULL END val
  7. UNION ALL SELECT 5 pos, CASE WHEN pt_c = 'Y' THEN 'PT' ELSE NULL END val
  8. UNION ALL SELECT 6 pos, CASE WHEN sw_c = 'Y' THEN 'SW' ELSE NULL END val
  9. UNION ALL SELECT 7 pos, CASE WHEN psych_c = 'Y' THEN 'PSY' ELSE NULL END val
  10. UNION ALL SELECT 8 pos, CASE WHEN other_c = 'Y' THEN 'OTH' ELSE NULL END val
  11. ) AS allDisciplines
  12. WHERE val IS NOT NULL
  13. ) AS notNullDisciplines
  14. PIVOT (
  15. MAX(val) FOR position IN ([1], [2], [3])
  16. ) AS pivotTable

) AS pivotedDisciplines
ORDER BY uniqueid_c;

展开查看全部
omvjsjqw

omvjsjqw2#

下面是我在xml中使用的技巧。不一定很漂亮,但对我很管用。
在ssms中可以运行以下操作:

  1. -- Eligibility table mock-up.
  2. DECLARE @tb_cdsa_eligibility TABLE (
  3. uniqueid_c VARCHAR(50), slp_c VARCHAR(1), ot_c VARCHAR(1), SpecEd_c VARCHAR(1), medical_c VARCHAR(1), pt_c VARCHAR(1), sw_c VARCHAR(1), psych_c VARCHAR(1), other_c VARCHAR(1)
  4. );
  5. -- Eligibility data.
  6. INSERT INTO @tb_cdsa_eligibility ( uniqueid_c, slp_c, ot_c, SpecEd_c, medical_c, pt_c, sw_c, psych_c, other_c )
  7. VALUES
  8. ( '01058134223008B00D', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ),
  9. ( '081760744000051001', 'Y', NULL, NULL, NULL, NULL, 'Y', NULL, 'Y' ),
  10. ( '110161606330071025', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, 'Y' ),
  11. ( '12014113922009C007', NULL, NULL, NULL, NULL, NULL, 'Y', NULL, 'Y' );
  12. -- Preview the eligibility data.
  13. SELECT * FROM @tb_cdsa_eligibility ORDER BY uniqueid_c;

预览返回

  1. +--------------------+-------+------+----------+-----------+------+------+---------+---------+
  2. | uniqueid_c | slp_c | ot_c | SpecEd_c | medical_c | pt_c | sw_c | psych_c | other_c |
  3. +--------------------+-------+------+----------+-----------+------+------+---------+---------+
  4. | 01058134223008B00D | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
  5. | 081760744000051001 | Y | NULL | NULL | NULL | NULL | Y | NULL | Y |
  6. | 110161606330071025 | NULL | NULL | NULL | NULL | Y | NULL | NULL | Y |
  7. | 12014113922009C007 | NULL | NULL | NULL | NULL | NULL | Y | NULL | Y |
  8. +--------------------+-------+------+----------+-----------+------+------+---------+---------+

ssms(续)

  1. -- Select the first three disciplines for insert...
  2. SELECT
  3. uniqueid_c,
  4. Disciplines.List.value ( 'data(//values/val)[1]', 'VARCHAR(10)' ) AS Discipline1_c,
  5. Disciplines.List.value ( 'data(//values/val)[2]', 'VARCHAR(10)' ) AS Discipline2_c,
  6. Disciplines.List.value ( 'data(//values/val)[3]', 'VARCHAR(10)' ) AS Discipline3_c
  7. FROM @tb_cdsa_eligibility
  8. OUTER APPLY (
  9. -- Create an XML value list that can be queried...
  10. SELECT CAST ( (
  11. SELECT '<values>'
  12. + CASE WHEN slp_c = 'Y' THEN '<val>SLP</val>' ELSE '' END
  13. + CASE WHEN ot_c = 'Y' THEN '<val>OT</val>' ELSE '' END
  14. + CASE WHEN SpecEd_c = 'Y' THEN '<val>SE</val>' ELSE '' END
  15. + CASE WHEN medical_c = 'Y' THEN '<val>MED</val>' ELSE '' END
  16. + CASE WHEN pt_c = 'Y' THEN '<val>PT</val>' ELSE '' END
  17. + CASE WHEN sw_c = 'Y' THEN '<val>SW</val>' ELSE '' END
  18. + CASE WHEN psych_c = 'Y' THEN '<val>PSY</val>' ELSE '' END
  19. + CASE WHEN other_c = 'Y' THEN '<val>OTH</val>' ELSE '' END
  20. + '</values>'
  21. ) AS XML ) AS List
  22. ) AS Disciplines
  23. ORDER BY uniqueid_c;

退货

  1. +--------------------+---------------+---------------+---------------+
  2. | uniqueid_c | Discipline1_c | Discipline2_c | Discipline3_c |
  3. +--------------------+---------------+---------------+---------------+
  4. | 01058134223008B00D | NULL | NULL | NULL |
  5. | 081760744000051001 | SLP | SW | OTH |
  6. | 110161606330071025 | PT | OTH | NULL |
  7. | 12014113922009C007 | SW | OTH | NULL |
  8. +--------------------+---------------+---------------+---------------+

可以将前三个规程的结果插入表中,也可以像普通查询一样直接返回结果。
注意使用 data(//values/val)[n] . 值n引用规程列表中的特定索引。如果n索引不存在,则返回null。您还可以通过添加另一个“discipline[#]c”列并增加n的值来增加返回的规程数。
您可以通过更改 CASE 内部秩序 OUTER APPLY . 在我的示例中,我默认为您的列顺序。

展开查看全部

相关问题