2016-04-28 33 views
-1

請幫助我弄清楚如何使用包含來自不同表的兩個外鍵的複合主鍵插入新記錄。 我正在C#中工作,WPF如果有問題。插入帶有複合主鍵的新記錄,其中包含來自不同表的兩個外鍵

我有三個表格:Sales,SaleItem,Item。

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]) 
    ); 

我要插入一個新的記錄到SaleItem表(第三個),其中saleID被記錄在銷售表和ItemSKU最後一個ID等於我從另一個窗口中獲得的價值。

我想這些值:

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

我想我必須這樣做在一個查詢,但我不知道怎麼樣。 你能給我一個提示嗎?我

回答

0

首先,您需要從dbo.SaleItem表中刪除IDENTITY屬性。僅在父表dbo.Sales上需要IDENTITY屬性。

您可以像這樣執行單個INSERT語句。它使用兩個子查詢(它們是括號中的SELECT語句)從另外兩個表中獲取值。

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

您可能希望把它變成一個存儲過程,就像這樣:

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

然後使用存儲過程:

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

SELECT * 
    FROM dbo.SaleItem; 

enter image description here

要閱讀更多關於子查詢,請參閱Itzik Ben-Gan在「Microsoft SQL Server 2012 T-SQL基礎知識」一章中的章節4:子查詢。

+0

謝謝!這樣可行! –

相關問題