2

我有一个 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 并将其插入到关系表中。

我尝试了一个愚蠢的查询..但我不知道这样做的正确方法..类似,

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')

有人可以指导我吗?

4

2 回答 2

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')

如有必要,您始终可以查询您的产品关系表以将其恢复为 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
于 2012-07-12T07:08:14.617 回答
1

您可以使用 Access 的DLookup 函数来检索您的值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方法以适应该结构。

于 2012-07-12T08:16:47.993 回答