根据查询结果插入多行

时间:2015-01-22 02:22:47

标签: sql sql-server sql-server-2008

我正在为我们网站的更新构建一些数据保护答案,而且这个问题让我难以理解SQL Server 2008 R2:

我需要为传统客户插入这些问题的“答案”。这是一个适用于单个记录的示例语句:

INSERT INTO DataProtection
(
    Id, 
    HolderCompanyId,
    IssuerCompanyid,
    AnswerEnum, --The answer (1,2,3) to the DP question
    AnsweredDate,
    ClientId, --This is the customer's unique ID
    QuestionId --The ID of the question from a different table
) 
VALUES 
(
    '9ee9455b-3ba5-440e-8329-c556ae8a1c7e',
    1127,
    1127,
    10,
    { ts '2015-01-20 00:00:00' },
    '12345',
    '3'
);

对于没有针对每个问题(ClientID)的条目的记录,我将如何为此插入数据库(每QuestionID行多次)?

示例:对于数据保护问题1和2,客户ID 12345已回答“1”,但在问题3-6的数据库中没有条目。有很多这样的记录。

2 个答案:

答案 0 :(得分:1)

我不清楚您是否有要插入的记录('其他')或已经存在于数据库中的类似表中。

要在一个语句中执行多个更新,请使用以下命令:

INSERT INTO 
    DataProtection (Id, HolderCompanyId ...)
VALUES 
    ('9ee9455b-3ba5-440e-8329-c556ae8a1c7e', 1127 ...),
    ('9ee9455b-3ba5-440e-8329-c556ae8a1c7f', 1128 ...),
    ('9ee9455b-3ba5-440e-8329-c556ae8a1c7g', 1129 ...),
    ('9ee9455b-3ba5-440e-8329-c556ae8a1c7h', 1120 ...)

如果您拥有另一个表中的数据,则可以使用以下语法将其选择到另一个表中:

INSERT INTO Table (DestCol1, DestCol2)
SELECT SourceCol1, SourceCol2
FROM SourceTable
WHERE SomeCondition

答案 1 :(得分:0)

我没有让SQL Server停止测试,但是这样:

    INSERT INTO DataProtection
(SELECT Id, HolderCompanyId, IssuerCompanyid, COALESCE(AnswerEnum, 'Answer Not Available'), COALESCE(AnsweredDate, 'No Answer Date')
    ClientId, cj.questionId
 FROM 
(SELECT UNIQUE ClientId FROM DataProtection 
CROSS JOIN QuestionsTable) AS cj
LEFT JOIN DataProtection AS dp ON cj.QuestionID=dp.QuestionId
WHERE AnswerEnum IS NULL)

你基本上想要用问题Ids CROSS JOIN唯一的客户端ID,然后用DataProtection表加入它。然后过滤以获取没有答案的行。这些是您要插入DataProtection表的那些。