2016-04-28 9 views
-1

異なるテーブルの2つの外部キーで構成されるコンポジットプライマリキーで新しいレコードを挿入する方法を理解してください。 C#、WPFで作業しています。異なるテーブルの2つの外部キーで構成されるコンポジットプライマリキーで新しいレコードを挿入

私は、Sales、SaleItem、Itemという3つのテーブルを持っています。

CREATE TABLE [dbo].[Sales] (
    [saleID]  INT  IDENTITY (1, 1) NOT NULL, 
    [saleTime] DATETIME NOT NULL, 
    [customerID] INT  NULL, 
    [TIN]  INT  NOT NULL, 
    CONSTRAINT [PK_Sales] PRIMARY KEY CLUSTERED ([saleID] ASC), 
    CONSTRAINT [FK_Sales_Customers] FOREIGN KEY ([customerID]) REFERENCES [dbo].[Customers] ([customerID]), 
    CONSTRAINT [FK_Sales_Company] FOREIGN KEY ([TIN]) REFERENCES [dbo].[Company] ([TIN]) 
); 



CREATE TABLE [dbo].[Item] (
    [ItemSKU]  INT   IDENTITY (1, 1) NOT NULL, 
    [itemName] NVARCHAR (50) NOT NULL, 
    [volume]  FLOAT (53) NOT NULL, 
    [measureUnit] NVARCHAR (50) NOT NULL, 
    [producer] NVARCHAR (50) NOT NULL, 
    [supplierID] INT   NOT NULL, 
    [retailPrice] NUMERIC (18) NOT NULL, 
    CONSTRAINT [PK_Item] PRIMARY KEY CLUSTERED ([ItemSKU] ASC), 
    CONSTRAINT [FK_Item_Suppliers] FOREIGN KEY ([supplierID]) REFERENCES [dbo].[Suppliers] ([supplierID]) 
); 

CREATE TABLE [dbo].[SaleItem] (
     [saleID] INT IDENTITY (1, 1) NOT NULL, 
     [itemSKU] INT NOT NULL, 
     [quantity] INT NOT NULL, 
     CONSTRAINT [PK_SaleItem] PRIMARY KEY CLUSTERED ([saleID] ASC, [itemSKU] ASC), 
     CONSTRAINT [FK_SaleItem_Sales] FOREIGN KEY ([saleID]) REFERENCES [dbo].[Sales] ([saleID]), 
     CONSTRAINT [FK_SaleItem_Item] FOREIGN KEY ([itemSKU]) REFERENCES [dbo].[Item] ([ItemSKU]) 
    ); 

私はsaleIDは、私は別のウィンドウから取得した値に等しい売上テーブルとItemSKUに記録された最後のIDですSaleItemテーブルに新しいレコード(第3 1)を挿入します。

私は、これらの値をしたい:

SaleID = SELECT TOP 1 saleID FROM Sales ORDER BY saleID DESC"; 
ItemSKU = "SELECT itemName FROM Item WHERE ItemSKU = @sku"; 

私は、私は1つのクエリでそれを行う必要がありますと思いますが、私はどのようには考えています。 私にヒントを教えてもらえますか? I

答えて

0

まず、dbo.SaleItemテーブルからIDENTITYプロパティを削除する必要があります。 IDENTITYプロパティは、親テーブルのdbo.Salesにのみ必要です。

このように1つのINSERT文を実行できます。 2つのサブクエリ(括弧内のSELECT文)を使用して、他の2つのテーブルから値を取得します。

INSERT INTO dbo.SaleItem (saleID, itemSKU, quantity) 
    VALUES ((SELECT MAX(saleID) FROM dbo.Sales), 
     (SELECT ItemSKU FROM dbo.Item WHERE itemName = N'Widget'), 
     50); 

あなたはこのように、ストアドプロシージャにそれを有効にする場合があります:

-- Test the stored procedure 
EXEC dbo.up_InsertSaleItem @itemName=N'Widget', @quantity=50; 

SELECT * 
    FROM dbo.SaleItem; 

enter image description here

続きを読むには:

CREATE PROCEDURE dbo.up_InsertSaleItem 
(
    @itemName nvarchar(50), 
    @quantity int 
) 
AS 
INSERT INTO dbo.SaleItem (saleID, itemSKU, quantity) 
    VALUES ((SELECT MAX(saleID) FROM dbo.Sales), 
     (SELECT ItemSKU FROM dbo.Item WHERE itemName = @itemName), 
     @quantity); 

はその後、ストアドプロシージャを使用しますサブクエリについては、Itzik Ben-GanのMicrosoft SQL Server 2012 T-SQLの基礎、章を参照してください。 4:サブクエリ。

+0

ありがとうございました!それは動作します! –

関連する問題