2016-10-17 69 views
1

我试图插入来自Table 1和Table ID为Table3.My表的设计是:SQL INSERT SELECT从表2到表3

Table1: 
Id_Table1 
field1 etc. 

Table2: 
Id_Table2 
field1 etc. 

Table3: 
Id_Table3 
Id_Table1_FK 
Id_Table2_FK 

我这样做时,我保存表1的记录。同时,我在我的表单中使用Datagridview,它使用组合框来查看表2中的记录。当我从Table2中选择一些记录时,需要将两个ID(表1 &表2)插入表3中。

这里是我到目前为止的代码(显然是不对的):

INSERT INTO Table3 (Id_Table3, Id_Table1, Id_Table2) 

SELECT Id_Table2 FROM Table2 WHERE serial_no=" & MyDGV.CurrentRow.Cells(0).Value.ToString 

VALUES (Id_Table3_seq.nextval, Id_Table1_seq.currval,????) 

所以,我的问题stucks与Id_Table2这需要由Datagridview.Row单元格的值第一选择,然后通过结果像参数表3。有什么建议么 ?也许容易,我只是不知道如何下手......

+0

我的问题可能是愚蠢的,但你可以肯定的是你的选择查询将返回正好为1倍的值?它可能没有价值吗? – romulus001

+0

@ romulus001,no它不能返回任何值。此INSERT仅发生如果您从Datagrid中的Comboboxcell中选择一些记录。 – LuckyLuke82

+0

@ romulus001,对此,我已经在查询中添加了Top 1,以确保它只会返回一个记录集。但是如果该字段是唯一的,则是可选的。 (正如我在编辑中提到的)。 –

回答

2

如果我得到你的一点没错,这是你所需要的可能?

INSERT INTO Table3 (Id_Table3, Id_Table1, Id_Table2) 
VALUES (Id_Table3_seq.nextval, Id_Table1_seq.currval,(
SELECT Top 1 Id_Table2 FROM Table2 WHERE serial_no='" & MyDGV.CurrentRow.Cells(0).Value.ToString & "' 
)) 

编辑:新增Top 1以确保子查询只会返回1个记录。如果您选择的字段是唯一的,那么它是可选的。

+1

谢谢,你了解我!我不知道我也可以这样写SQL。 – LuckyLuke82

+0

不客气。 –

+0

请使用SQL参数而不是字符串。 –

0

使用SELECT返回常数衣被合计:

INSERT INTO Table3 (Id_Table3, Id_Table1, Id_Table2) 
select Id_Table3_seq.nextval, 
     Id_Table1_seq.currval, 
     Id_Table2 
FROM Table2 
WHERE serial_no='" & MyDGV.CurrentRow.Cells(0).Value.ToString & "'; 

一般来说,你不应该串连值转换为SQL字符串。使用带有参数(占位符)一份准备好的声明,而不是(不知道这是如何在VB.net做)