Lutz
2013-12-02 14:16:32 UTC
Hallo NG!
Die Überschrift ist noch relativ nichtssagend.
Ich habe eine Software, die Tarifpläne mitsamt Verbindungen,
Preisstufen, Preisen etc verwaltet.
Wenn ich einen neuen Tarifplan anlege, möchte ich die Einträge des
letzten Tarifplans unter der ID des neuen Tarifplans in dieseleben
Stammdatentabellen eintragen.
Wenn ich davon ausgehe, daß unter der neuen ID noch keine Einträge
existieren dann ist das nicht schwer - es können aber theoretisch schon
Einträge vorhanden sein. Dann sollen alle noch nciht vorhandenen
eingefügt werden.
Das sind z.B. zwei Tabellen. TP ist dabei die ID für den Tarifplan
Es gibt eine Preisstufen-Tabelle ...
CREATE TABLE [dbo].[t_Fk_Preisstufe](
[TP] [int] NOT NULL, -- PK
[PSt] [int] NOT NULL, -- PK
[Preisstufe] [nvarchar](20) NOT NULL,
[PreisstufeBez] [nvarchar](100) NULL,
) ON [PRIMARY]
ALTER TABLE [dbo].[t_Fk_Preisstufe] ADD CONSTRAINT
[t_Fk_Preisstufe$PrimaryKey] PRIMARY KEY CLUSTERED
([TP] ASC,[PSt] ASC)
... und eine Preistabelle, welche für Preisstufe und Ticket einen Preis
liefert.
CREATE TABLE [dbo].[t_Fk_Preis](
[TP] [int] NOT NULL, -- PK
[PSt] [int] NOT NULL, -- PK
[TID] [int] NOT NULL, -- PK
[Preis] [money] NOT NULL,
) ON [PRIMARY]
ALTER TABLE [dbo].[t_Fk_Preis] ADD CONSTRAINT [t_Fk_Preis$PrimaryKey]
PRIMARY KEY CLUSTERED
([TP] ASC,[PSt] ASC,[TID] ASC)
Nun möchte ich die Einträge des alten Tarifplans auf den neuen duplizieren.
Bei Preisstufe kann ich das noch mit NOT IN lösen.
INSERT INTO [dbo].[t_Fk_Preisstufe]
([TP],[PSt],[Preisstufe],[PreisstufeBez])
SELECT @nNeuTP AS [TP],[PSt],[Preisstufe],[PreisstufeBez]
FROM [dbo].[t_Fk_Preisstufe]
WHERE [TP]=@nAltTP AND PSt NOT IN
(SELECT PSt FROM dbo.t_Fk_Preisstufe WHERE TP=@nNeuTP)
Bei der Preistabelle ist das nicht mehr möglich, da ich zwei weitere
Schlüsselfelder (PSt, TID) habe.
INSERT INTO [dbo].[t_Fk_Preis]
([TP],[PSt],[TID],[Preis])
SELECT @nNeuTP AS [TP],[PSt],[TID],[Preis]
FROM [dbo].[t_Fk_Preis]
WHERE [TP]=@nAltTP AND (PSt,TID) NOT IN
(SELECT PSt,TID FROM dbo.t_Fk_Preis WHERE TP=@nNeuTP)
Das geht sicherlich auch mit einem JOIN zu lösen, aber ich komme im
Moment nicht darauf wie ich da ansetzen soll!
Ich möchte im Prinzip alle nicht im neuen Tarifplan vorhandenen
Datensätze aus dem alten in den neuen kopieren.
Wer kann helfen ...
Danke
Lutz
Die Überschrift ist noch relativ nichtssagend.
Ich habe eine Software, die Tarifpläne mitsamt Verbindungen,
Preisstufen, Preisen etc verwaltet.
Wenn ich einen neuen Tarifplan anlege, möchte ich die Einträge des
letzten Tarifplans unter der ID des neuen Tarifplans in dieseleben
Stammdatentabellen eintragen.
Wenn ich davon ausgehe, daß unter der neuen ID noch keine Einträge
existieren dann ist das nicht schwer - es können aber theoretisch schon
Einträge vorhanden sein. Dann sollen alle noch nciht vorhandenen
eingefügt werden.
Das sind z.B. zwei Tabellen. TP ist dabei die ID für den Tarifplan
Es gibt eine Preisstufen-Tabelle ...
CREATE TABLE [dbo].[t_Fk_Preisstufe](
[TP] [int] NOT NULL, -- PK
[PSt] [int] NOT NULL, -- PK
[Preisstufe] [nvarchar](20) NOT NULL,
[PreisstufeBez] [nvarchar](100) NULL,
) ON [PRIMARY]
ALTER TABLE [dbo].[t_Fk_Preisstufe] ADD CONSTRAINT
[t_Fk_Preisstufe$PrimaryKey] PRIMARY KEY CLUSTERED
([TP] ASC,[PSt] ASC)
... und eine Preistabelle, welche für Preisstufe und Ticket einen Preis
liefert.
CREATE TABLE [dbo].[t_Fk_Preis](
[TP] [int] NOT NULL, -- PK
[PSt] [int] NOT NULL, -- PK
[TID] [int] NOT NULL, -- PK
[Preis] [money] NOT NULL,
) ON [PRIMARY]
ALTER TABLE [dbo].[t_Fk_Preis] ADD CONSTRAINT [t_Fk_Preis$PrimaryKey]
PRIMARY KEY CLUSTERED
([TP] ASC,[PSt] ASC,[TID] ASC)
Nun möchte ich die Einträge des alten Tarifplans auf den neuen duplizieren.
Bei Preisstufe kann ich das noch mit NOT IN lösen.
INSERT INTO [dbo].[t_Fk_Preisstufe]
([TP],[PSt],[Preisstufe],[PreisstufeBez])
SELECT @nNeuTP AS [TP],[PSt],[Preisstufe],[PreisstufeBez]
FROM [dbo].[t_Fk_Preisstufe]
WHERE [TP]=@nAltTP AND PSt NOT IN
(SELECT PSt FROM dbo.t_Fk_Preisstufe WHERE TP=@nNeuTP)
Bei der Preistabelle ist das nicht mehr möglich, da ich zwei weitere
Schlüsselfelder (PSt, TID) habe.
INSERT INTO [dbo].[t_Fk_Preis]
([TP],[PSt],[TID],[Preis])
SELECT @nNeuTP AS [TP],[PSt],[TID],[Preis]
FROM [dbo].[t_Fk_Preis]
WHERE [TP]=@nAltTP AND (PSt,TID) NOT IN
(SELECT PSt,TID FROM dbo.t_Fk_Preis WHERE TP=@nNeuTP)
Das geht sicherlich auch mit einem JOIN zu lösen, aber ich komme im
Moment nicht darauf wie ich da ansetzen soll!
Ich möchte im Prinzip alle nicht im neuen Tarifplan vorhandenen
Datensätze aus dem alten in den neuen kopieren.
Wer kann helfen ...
Danke
Lutz
--
news.albasani.net
news.albasani.net