Fragensteller
Datensätze einer Tabelle mit Datensätzen anderer Tabelle "überlagern"

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
- Typ geändert Raul TalmaciuMicrosoft contingent staff Donnerstag, 17. April 2014 11:27 Warten auf Feedback
Alle Antworten
-
Hi,
besteht die Möglichkeit, in deinen Tabellen eine neue Spalte mit einem PrimaryKey auf eine Spalte zu erstellen (bspw. ID int, in der Importtabelle als IDENTITY, in der anderen Tabelle ohne IDENTITY)? Falls ja, könnte man das bspw. so machen:
SELECT ... FROM cstm.Produkt UNION ALL SELECT ... FROM dbo.Produkt WHERE ID NOT IN ( SELECT ID FROM cstm.Produkt )
Hierfür müsstest Du dann den Datensatz in deiner Benutzertabelle nur mit derselben ID wie der des Importdatensatzes speichern.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Donnerstag, 3. April 2014 08:44
-
Hallo,
hat der Tipp weitergeholfen?
Gruss,
RaulRaul Talmaciu, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.