2009-08-09 95 views
1

我有一个有趣的益智SQL我一直没能解决,你希望一个有更多的SQL福不是我做的。我有两个表设置是这样的:插入缺少的行

tblFormElement 
    FrmElementID 
    Label 

tblFormSubmissionElement 
    FrmID_fk 
    FrmElementID_fk 
    SubmitID_fk 
    SubmissionValue 

如果我运行下面的SQL:

SELECT tblFormElement.Label, tblFormSubmissionElement.* FROM tblFormElement 
JOIN tblFormSubmissionElement ON FrmElementID = FrmElementID_fk 
WHERE FrmID_fk = 55 
AND SubmitID_fk = 7062 

我会得到一个结果集,看起来像这样:

Label | FrmID_fk | FrmElementID_fk | SubmitID_fk | SubmissionValue 

Label1 | 55  | 1601   | 7062  | Foo1 
Label2 | 55  | 1602   | 7062  | Foo2 
Label3 | 55  | 1603   | 7062  | Foo3 
Label4 | 55  | 1604   | 7062  | Foo4 
Label5 | 55  | 1605   | 7062  | Foo5 

现在,如果我将SubmitID_fk更改为低于7062的任何值,我会得到如下结果:

Label | FrmID_fk | FrmElementID_fk | SubmitID_fk | SubmissionValue 

Label1 | 55  | 1601   | 5011  | Foo1 
Label2 | 55  | 1602   | 5011  | Foo2 
Label3 | 55  | 1603   | 5011  | Foo3 
Label5 | 55  | 1605   | 5011  | Foo5 
 
What I would like to do is execute an INSERT statement for every one of these 
result sets which lack that Label4 row. Or in other words, For each result set 
which does not contain a row with FrmElementID_fk equal to 1604, INSERT the 
row with the respective columns. Any thoughts on how to attack this problem?
+0

为什么不使用FrmElementID_fk <> 1604作为条件? – 2009-08-09 07:08:23

回答

2

我想你想要这样的东西。

INSERT INTO tblFormSubmissionElement 
    SELECT 55, 1604, SubmitID_fk, 'Foo4' 
    FROM tblFormSubmissionElement 
    WHERE SubmitID_fk < 7026 
     AND FrmElementID_fk = 1603; 

有可能是使用DISTINCT,而不是FrmElementID_fk匹配到1603的方式,但我认为这应该工作了。

+1

这是AND而不是&& for SQL – Andomar 2009-08-09 08:25:18

+0

@Andomar谢谢!我很习惯总是使用mysql,我甚至没有看到它不是。 – Cahlroisse 2009-08-09 09:02:01

0

使用您的选择查询:

Insert into OtherTable (
SELECT tblFormElement.Label, tblFormSubmissionElement.* 
FROM tblFormElement 
     JOIN tblFormSubmissionElement 
     ON FrmElementID = FrmElementID_fk 
WHERE FrmID_fk = 55 
AND SubmitID_fk <> 1604) 

是不是你想要的?