none
Datensätze einer Tabelle mit Datensätzen anderer Tabelle "überlagern" RRS feed

  • Allgemeine Diskussion

  • Hallo zusammen,

    ich habe Tabellen, die aus einem Fremdsystem befüllt werden. Diese Daten sollen durch den Benutzer überschrieben werden können, ohne dass tatsächlich die ursprüglichen Daten verändert werden. Ich habe mir gedacht, dass man die Tabellenstruktur spiegelt und dann „überlagert“ solange der Datensatz gültig ist. Das ganze sähe so aus:

    IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'cstm')
    	EXEC('CREATE SCHEMA cstm AUTHORIZATION dbo;');
    GO
    
    CREATE TABLE [dbo].[Produkt]
    (
    	[ProduktID] [int] NOT NULL,
    	[Name] [varchar](100) NULL,
    	[Preis] [money] NULL,
    	[gueltig_ab] [date] NULL,
    	[gueltig_bis] [date] NULL,
    	PRIMARY KEY ([ProduktID])
    ) ON [PRIMARY]
    GO
    
    CREATE TABLE [cstm].[Produkt]
    (
    	[ProduktID] [int] NOT NULL,
    	[Name] [varchar](100) NULL,
    	[Preis] [money] NULL,
    	[gueltig_ab] [date] NULL,
    	[gueltig_bis] [date] NULL,
    	PRIMARY KEY ([ProduktID])
    ) ON [PRIMARY]
    GO
    
    INSERT [dbo].[Produkt] ([ProduktID], [Name], [Preis], [gueltig_ab], [gueltig_bis]) VALUES (1, N'Tea', 10.0000, CAST(0x01380B00 AS Date), CAST(0x20380B00 AS Date));
    INSERT [dbo].[Produkt] ([ProduktID], [Name], [Preis], [gueltig_ab], [gueltig_bis]) VALUES (2, N'Coffee', 20.0000, CAST(0x01380B00 AS Date), NULL);
    INSERT [dbo].[Produkt] ([ProduktID], [Name], [Preis], [gueltig_ab], [gueltig_bis]) VALUES (3, N'Muffin', 30.0000, CAST(0x01380B00 AS Date), NULL);
    INSERT [dbo].[Produkt] ([ProduktID], [Name], [Preis], [gueltig_ab], [gueltig_bis]) VALUES (4, N'Biscuit', 40.0000, CAST(0x01380B00 AS Date), NULL);
    INSERT [cstm].[Produkt] ([ProduktID], [Name], [Preis], [gueltig_ab], [gueltig_bis]) VALUES (1, N'Tea', 10.0000, CAST(0xB3360B00 AS Date), NULL);
    INSERT [cstm].[Produkt] ([ProduktID], [Name], [Preis], [gueltig_ab], [gueltig_bis]) VALUES (2, N'Coffee', 25.0000, CAST(0x20380B00 AS Date), NULL);
    INSERT [cstm].[Produkt] ([ProduktID], [Name], [Preis], [gueltig_ab], [gueltig_bis]) VALUES (3, N'Muffin', 35.0000, CAST(0xB3360B00 AS Date), NULL);
    INSERT [cstm].[Produkt] ([ProduktID], [Name], [Preis], [gueltig_ab], [gueltig_bis]) VALUES (5, N'Pizza', 60.0000, CAST(0x20380B00 AS Date), NULL);
    GO

    um die aktuell gültige Siht zu erhalten hätte ich dann folgende Abfrage

    SELECT * FROM
    (
    	SELECT * FROM [dbo].[Produkt]
    	UNION
    	SELECT * FROM [cstm].[Produkt]
    ) AS v
    WHERE v.gueltig_ab = (SELECT MAX(gueltig_ab) FROM (SELECT * FROM [dbo].[Produkt] UNION SELECT * FROM [cstm].[Produkt]) AS sub WHERE v.ProduktID = sub.ProduktID AND (gueltig_bis >= getdate() OR gueltig_bis IS NULL))
    

    Nun stellt sich mir die Frage, ob das nicht auch eleganter und performanter geht. Hat jemand Erfahrung mit einer solchen Problematik?

    Viele Grüße

    webbies

    Donnerstag, 3. April 2014 08:17

Alle Antworten