使用SELECT插入以插入多条记录

问题描述 投票:18回答:7

在下图中,“ DodgyOldTable”和“ MainTable”之间存在1:1的关系。表“选项”包含在“选项描述”字段中具有“选项Val1,”选项Val2”和“选项Val3”的记录。我需要从DodgyOldTable中选择一个插入MainTable_Option中。像这样的东西:

INSERT MainTable_Option ([MainTableID],[OptionID])
SELECT ID, (CASE WHEN OptionVal1 = 'y' THEN 
    (SELECT OptionID 
     FROM Option 
     WHERE OptionDesc = 'OptionVal1') END
FROM DodgyOldTable

[如果可能,我想避免使用几个不同的select语句来执行插入操作。

alt text http://www.freeimagehosting.net/uploads/863f10bf5f.jpg

sql sql-server sql-server-2005
7个回答
35
投票
INSERT 
  MainTable_Option 
  (
  MainTableID, 
  OptionID
  )
SELECT
  d.ID, 
  o.OptionId
FROM
  DodgyOldTable d
  INNER JOIN Option o ON
    (d.OptionVal1 = 'Y' AND o.OptionDesc = 'OptionVal1') OR
    (d.OptionVal2 = 'Y' AND o.OptionDesc = 'OptionVal2') OR
    (d.OptionVal3 = 'Y' AND o.OptionDesc = 'OptionVal3')

1
投票

我的经验是,将其分成较小的部分通常更容易理解。因此,请勿尝试在单个查询中完成所有操作。尤其是在制作迁移脚本时,这应该不是问题。

写下步骤,也许引入一个临时表,编写脚本来迁移数据,您就可以了!


1
投票

CROSS JOIN解决方案如何?

DECLARE @DodgyOldTable TABLE (ID INT, OptionVal1 CHAR, OptionVal2 CHAR, 
  OptionVal3 CHAR)
INSERT INTO @DodgyOldTable
SELECT 1, 'y', 'n', 'y' UNION
SELECT 2, 'y', 'n', 'n' UNION
SELECT 3, 'n', 'n', 'y' UNION
SELECT 4, 'y', 'y', 'y' UNION
SELECT 5, 'n', 'n', 'n'

DECLARE @Option TABLE (OptionID INT, OptionDesc VARCHAR(100))
INSERT INTO @Option
SELECT 1, 'OptionVal1' UNION
SELECT 2, 'OptionVal2' UNION
SELECT 3, 'OptionVal3'

SELECT ID, OptionID FROM
(
    SELECT 
        ID, 
        CASE    
          WHEN (OptionVal1 = 'y' AND OptionDesc = 'OptionVal1') 
            OR (OptionVal2 = 'y' AND OptionDesc = 'OptionVal2') 
            OR (OptionVal3 = 'y' AND OptionDesc = 'OptionVal3')
          THEN OptionID 
          ELSE NULL 
        END AS OptionID 
    FROM @DodgyOldTable DOT CROSS JOIN @Option O 
)CRS
WHERE OptionID IS NOT NULL

1
投票

也许不是最有效的解决方案,但是通过使用联合,这应该可以工作。

INSERT MainTable_Option ([MainTableID],[OptionID])
SELECT ID, (SELECT OptionID FROM Option WHERE OptionDesc = 'OptionVal1')
FROM DodgyOldTable dot
WHERE OptionVal1 = 'y'
UNION SELECT ID, (SELECT OptionID FROM Option WHERE OptionDesc = 'OptionVal2')
FROM DodgyOldTable dot
WHERE OptionVal2 = 'y'
UNION SELECT ID, (SELECT OptionID FROM Option WHERE OptionDesc = 'OptionVal3')
FROM DodgyOldTable dot
WHERE OptionVal3 = 'y'

0
投票

我想说,如果可以的话,手动迁移脚本会更易于使用,然后尝试在单个sql查询中进行操作。


0
投票

您可以将所有选择组合在一起以给出一个结果集,但是这取决于您不希望多个选择的原因-如果选择过多或选择的数量可能经常变化,修改它仍然很痛苦。查询其他选择。不幸的是,我认为您将必须将逻辑放置在确定DodgyOldTable的哪一位映射到新结构的地方,并编写迁移脚本(或SSIS包)以进行批量迁移(如果这是一项工作)或UNION您的结果在一起...

INSERT MainTable_Option ([MainTableID],[OptionID])
SELECT ID, (CASE WHEN OptionVal1 = 'y' THEN (SELECT OptionID FROM Option WHERE OptionDesc = 'OptionVal1') END
FROM DodgyOldTable
WHERE OptionVal1 = 'y
UNION
SELECT ID, (CASE WHEN OptionVal2 = 'y' THEN (SELECT OptionID FROM Option WHERE OptionDesc = 'OptionVal2') END
FROM DodgyOldTable
WHERE OptionVal2 = 'y
...

0
投票

11年后,但可能会帮助某人:

INSERT INTO schema.tableName (col1, col2,col3, col4, col5, col6, col7)
      SELECT col1, 
             col2,
             'Static value',
             CURRENT_TIMESTAMP,
             'Anothe static value', 
             1, 
             (SELECT col7 FROM schema2.anotherTableName)
       FROM schema.tableX;

col1和col2来自同一选择

col3,col5是静态字符串

col4是当前系统时间

col6一个Num值,

col7从一个选择中返回一个值。

注意:请确保具有多个值的选择位于开头。这是MySQL

© www.soinside.com 2019 - 2024. All rights reserved.