2016-04-28 11 views
-1

Bitte helfen Sie mir herauszufinden, wie man einen neuen Datensatz mit zusammengesetztem Primärschlüssel einfügt, der aus zwei Fremdschlüsseln aus verschiedenen Tabellen besteht. Ich arbeite in C#, WPF, wenn das zählt.Neuen Datensatz mit zusammengesetztem Primärschlüssel einfügen, der aus zwei Fremdschlüsseln aus verschiedenen Tabellen besteht

Ich habe drei Tabellen: 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]) 
    ); 

Ich möchte einen neuen Datensatz in saleItem Tabelle einzufügen (die dritte), wo saleID die letzte ID in Tabelle Sales und ItemSKU aufgezeichnet ist, die auf den Wert I aus einem anderen Fenster bekommen gleich ist.

Ich möchte diese Werte:

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

Ich glaube, ich es in einer Abfrage tun müssen, aber ich habe keine Ahnung, wie. Können Sie mir bitte einen Tipp geben? I

Antwort

0

Zuerst müssen Sie die IDENTITY-Eigenschaft aus der Tabelle dbo.SaleItem entfernen. Die IDENTITY-Eigenschaft ist nur für die übergeordnete Tabelle dbo.Sales erforderlich.

Sie können eine einzelne INSERT-Anweisung wie folgt ausführen. Es verwendet zwei Unterabfragen, die SELECT-Anweisungen in Klammern, um Werte aus den anderen beiden Tabellen abzurufen.

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

Vielleicht möchten Sie es in eine gespeicherte Prozedur drehen, wie folgt aus:

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

dann die gespeicherte Prozedur zu verwenden:

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

SELECT * 
    FROM dbo.SaleItem; 

enter image description here

mehr zu lesen zu Unterabfragen, siehe Microsoft SQL Server 2012 T-SQL-Grundlagen von Itzik Ben-Gan, Kapitel 4: Unterabfragen.

+0

Vielen Dank! Das funktioniert! –

Verwandte Themen