2012-07-12 73 views
2

我有一个datagridview行,包含三个字符串值。应将这些值查找到产品表以找到相应的产品ID。然后这些将被插入到关系表中。我正在寻找最佳查询来实现这一目标。通过查找另一个表(Access 2007)插入记录

Here is my Products Table 
+------------+--------------+ 
| Product_ID | Product_Name | 
+------------+--------------+ 
|   1 | Foo   | 
|   2 | Bar   | 
|   3 | Baz   | 
|   4 | NewProduct | 
+------------+--------------+ 

和关系表我试图插入

+------------+----------------+-----------------+ 
| Product_Id | RelatedProd_Id | RelatedProd_Id2 | 
+------------+----------------+-----------------+ 
|   1 | 2    | null   | 
|   2 | 3    | 1    | 
|   3 | null   | null   | 
+------------+----------------+-----------------+ 

下面的一个不是表,这是一个样本的datagridview行..

+------------+--------------+---------------+ 
| ProdName | RelProd_Name | RelProd_Name2 | 
+------------+--------------+---------------+ 
| NewProduct | Foo   | Bar   | 
+------------+--------------+---------------+ 

我想从这一行查找id并将其插入到关系表中。

我尝试了哑巴query..but我不知道”做it..something像的正确方法,

INSERT INTO PROD_RELATIONS (Product_id,RelatedProd_Id,RelatedProd_Id2) 
VALUES 
(SELECT Product_Id FROM Products WHERE Product_Name = 'NewProduct'), 
(SELECT Product_Id FROM Products WHERE Product_Name = 'Foo'), 
(SELECT Product_Id FROM Products WHERE Product_Name = 'Bar') 

有人能指导我这个?

回答

2

根据您当前的表结构这样的查询会工作:

INSERT INTO Prod_Relations (Product_ID, RelatedProd_ID1, RelatedProd_ID2) 
SELECT t1.Product_ID, t2.PRoduct_ID, t3.Product_ID 
FROM Products t1, Products t2, Products t3 
WHERE T1.Product_Name = 'NewProduct' 
AND  t2.Product_Name = 'Foo' 
AND  t3.Product_Name = 'bar' 

不过,我建议你改变你的关系表,以一种更简单的布局,每个产品多行:

Product_ID | RelatedProd_ID 
------------+----------------- 
    4  |  1 
    4  |  2 

这意味着如果产品关系超过2个,则不必添加更多列。在这种情况下,你的插入语句应该是:

INSERT INTO Prod_Relations (Product_ID, RelatedProd_ID) 
SELECT t1.Product_ID, t2.PRoduct_ID 
FROM Products t1, Products t2 
WHERE T1.Product_Name = 'NewProduct' 
AND  t2.Product_Name IN ('Foo', 'Bar') 

您可以随时查询您的产品的关系表,如果有必要

SELECT t1.Product_ID, 
     MIN(t1.RelatedProd_ID) AS [RelatedProd_ID1], 
     MIN(t2.RelatedProd_ID) AS [RelatedProd_ID2] 
FROM Prod_Relations t1 
     LEFT JOIN Prod_Relations t2 
      ON t2.Product_ID = t1.Product_ID 
      AND t2.RelatedProd_ID > t1.RelatedProd_ID 
GROUP BY t1.Product_ID 
+0

感谢它的工作!我认为我对于更改表格布局有了一些看法:-) ...我对SQL /表结构颇为陌生...... – vinayan 2012-07-17 10:57:59

1

您可以使用Access' DLookup Function检索拿回来给2列的格式您的价值INSERT INTO PROD_RELATIONS

INSERT INTO PROD_RELATIONS (
    Product_id, 
    RelatedProd_Id, 
    RelatedProd_Id2 
    ) 
VALUES (
    DLookup("Product_Id", "Products", "Product_Name = 'NewProduct'"), 
    DLookup("Product_Id", "Products", "Product_Name = 'Foo'"), 
    DLookup("Product_Id", "Products", "Product_Name = 'Bar'") 
    ); 

相比之下,与您的示例查询,并注意个人SELECT件容易如何转化为DLookup()表达式。 DLookup非常类似于返回一个值的SELECT查询。

如果按照Gareth的建议重新设计餐桌,则可以采用这种方法来适应该结构。

+0

与派生表相比,Dlookup也非常慢。 – Fionnuala 2012-07-12 09:17:11

+0

不,它并不总是一件坏事,但与派生表相比,速度较慢。我自己使用它很多,但没有大量的数据。我在那种情况下为任何正在考虑DLookup的人添加了评论。最近有几个关于加速查询的问题。 – Fionnuala 2012-07-12 09:29:34

相关问题