Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Duplizieren - kopieren von noch nicht vorhandenen Datensätzen

4 views
Skip to first unread message

Lutz

unread,
Dec 2, 2013, 9:16:32 AM12/2/13
to
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

--
news.albasani.net

Lutz

unread,
Dec 5, 2013, 2:38:20 AM12/5/13
to
Hier der Vollstï¿œndigkeit halber die Lï¿œsung aus einer anderen NG

INSERT INTO [dbo].[t_Fk_Preis]
([TP],[PSt],[TID],[Preis])
SELECT @nNeuTP AS [TP],[PSt],[TID],[Preis]
FROM [dbo].[t_Fk_Preis] AS T1
WHERE [TP]=@nAltTP AND NOT EXISTS
(SELECT * FROM dbo.t_Fk_Preis AS T2
WHERE TP=@nNeuTP
AND T1.PSt = T2.PSt
AND T1.TID = T2.TID
)

oder

WITH cteAlteAlsNeu(TP, PSt, TID, Preis) AS
(
SELECT @nNeuTP AS TP, PSt, TID, Preis FROM dbo.t_Fk_Preis
WHERE TP=@nAltTP
)
INSERT INTO [dbo].[t_Fk_Preis]
([TP],[PSt],[TID],[Preis])
SELECT cteAlteAlsNeu.TP, cteAlteAlsNeu.PSt, cteAlteAlsNeu.TID,
cteAlteAlsNeu.Preis
FROM cteAlteAlsNeu LEFT JOIN dbo.t_Fk_Preis AS NEU ON (cteAlteAlsNeu.TP=
NEU.TP AND cteAlteAlsNeu.PSt=NEU.PSt AND cteAlteAlsNeu.TID=NEU.TID)
WHERE NEU.TID IS NULL;

0 new messages