2

3 つの文字列値を含む datagridview 行があります。これらの値は、対応する製品 ID を見つけるために Products テーブルを参照する必要があります。次に、これらがリレーション テーブルに挿入されます。これを達成するための最良のクエリを探しています。

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 を見つけて、関係テーブルに挿入しようとしています。

私は愚かなクエリを試しました..しかし、私はそれを行う正しい方法を知りません..何かのような、

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()式に変換されるかがわかります。1 つの値を返すクエリにDLookupよく似ています。SELECT

ガレスが提案するようにテーブルを再設計する場合、このDLookupアプローチをその構造に対応するように適応させることができます。

于 2012-07-12T08:16:47.993 に答える