我有一个datagridview行,包含三个字符串值。应将这些值查找到Products表中以查找相应的产品ID。然后将这些插入到关系表中。我正在寻找最好的查询来实现这一目标。
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 Row ..
+------------+--------------+---------------+
| ProdName | RelProd_Name | RelProd_Name2 |
+------------+--------------+---------------+
| NewProduct | Foo | Bar |
+------------+--------------+---------------+
我正在尝试从此行中找到ID并将其插入到Relations表中。
我尝试了一个愚蠢的查询..但我不知道这样做的正确方法......像是,
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')
有人可以指导我吗?
答案 0 :(得分: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语句将是:
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')
您可以随时查询产品关系表,以便在必要时将其恢复为2列格式
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
答案 1 :(得分:1)
您可以使用访问权限DLookup Function来检索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的建议重新设计你的桌子,你可以采用这种DLookup
方法来适应这种结构。