Benutzer mit den meisten Antworten
Aktuellen Datensatz: mehrere verknüpfte Tabellen

Frage
-
Hallo,
ich habe eine Tabelle in der Datei-Informationen gespeichert werden (ProLibraryFiles).
Zu diesen Datensätzen kann es Varianten geben (ProLibraryInstances).1:n Verknüpfung:
FileID zu InstIDZu den Datensätzen der Tabelle muss ich jetzt Detailinformationen (ProLibraryDetail) speichern.
Ich habe mir dann eine Verknüpfungstabelle erstellt:ProLibraryLinks:
LinkID (PrimaryKey)
FileID (int) Verknüpfung zu ProLibraryFiles
InstID (int) Verknüpfung zu ProLibraryInstances
DetailID (int) Verknüpfung zur ProLibraryDetail
LinkDate (DateTime) zur Speicherung, wann die Verknüpfung angelegt wurde.Wenn sich setzt Detailinformationen ändern, wird der bestehende Datensatz nicht
gelöscht sondern ich lege einen neuen Detaildatensatz und Verknüpfungsdatensatz an.Ich kann nun alle Änderungen der Details auflisten lassen, kein Problem. ABER:
Wie kann ich es realisieren, dass ich nur den aktuellsten (LinkDate) Datensatz bekomme?Ich hoffe, ich habe mich verständlich ausgedrückt. Ich bin dankbar über jeden Hinweis.
Gruß Lars
Antworten
-
Hallo Lars,
use tempdb go create table ProLibraryFiles ( FileID bigint identity not null, InstID bigint not null, FileName varchar not null, ) go create table ProLibraryInstances ( InstID bigint identity not null, FileID bigint not null, LinkDate datetime not null, InstanceName varchar not null ) go create table ProLibraryDetails ( DetailID bigint identity not null, MATNUM bigint not null, DEFTXT varchar not null, ATITLE varchar not null ) go create table ProLibraryLinks ( LinkID bigint identity not null, FileID bigint null, InstID bigint null, DetailID bigint null, LinkDate datetime null ) go declare @instID bigint = 470 declare @fileID bigint = 11 select pld.MATNUM , pld.DEFTXT , pld.ATITLE , pll.InstID , pll.FileID , plf.FileName , pli.InstanceName , pll.LinkID , pll.LinkDate from ProLibraryDetails pld inner join ProLibraryLinks pll on pld.DetailID = pll.DetailID left join ProLibraryFiles plf on pll.FileID = plf.FileID left join ProLibraryInstances pli on pll.InstID = pli.InstID and plf.FileID = pli.FileID where pll.InstID = @instID and pll.FileID = @fileID and pll.LinkDate = (select max(LinkDate) from ProLibraryLinks where FileID = pll.FileID and InstID = pll.InstID ) order by pll.LinkDate desc go --!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -- drop drop table ProLibraryDetails ,ProLibraryFiles ,ProLibraryLinks ,ProLibraryInstances go
- Als Antwort markiert Lamizi Freitag, 11. Februar 2011 07:48
Alle Antworten
-
mal so als Denkansatz ins Unreine geschrieben:
with cte as
(
select ..., row_number() over (partion by FileID,InstID order by LinkDate desc) as rn
from Tabelle1 a join tabelle2 b on
a.InstID = b.InstID ...
)select ... from cte
where rn = 1sollte Dir zu jeder Kombination FileID und InstID den jeweils jüngsten DS bringen.
Hilft Dir das nicht, poste bitte Create-Statements der Tabellen und Beispieldaten incl. des erwarteten Outputs.
-
Hallo Christa,
danke schon mal für die Antwort.
Aber dieses Statement habe ich überhaupt nicht verstanden.
Mit diesem Statement bekomme ich alle Datensätze angezeigt.
SELECT ProLibraryDetails.MATNUM, ProLibraryDetails.DEFTXT, ProLibraryDetails.ATITLE, ProLibraryLinks.InstID, ProLibraryLinks.FileID, ProLibraryFiles.FileName,
ProLibraryInstances.InstanceName, ProLibraryLinks.LinkID, ProLibraryLinks.LinkDate
FROM ProLibraryDetails INNER JOIN
ProLibraryLinks ON ProLibraryDetails.DetailID = ProLibraryLinks.DetailID LEFT OUTER JOIN
ProLibraryFiles ON ProLibraryLinks.FileID = ProLibraryFiles.FileID LEFT OUTER JOIN
ProLibraryInstances ON ProLibraryLinks.InstID = ProLibraryInstances.InstID AND ProLibraryFiles.FileID = ProLibraryInstances.FileID
WHERE (ProLibraryLinks.InstID = 470) AND (ProLibraryLinks.FileID = 11)
ORDER BY ProLibraryLinks.LinkDate DESCWHERE-Klausel habe ich jetzt nur zum Testen eingefügt.
Ergebnis:
MATNUM DEFTXT TITLE InstID FileID FileName InstanceName LinkID LinkDate
--------- ------------------- -------------- -------- -------- ----------------- -------------- -------- -------------------------------
K595-384 Ø3.20X4.00X37.30° JUSTIERKEIL 470 11 adjusting_wedge k595-384 9438 2011-02-07 08:36:25.000
K595-384 JUSTIERKEIL 470 11 adjusting_wedge k595-384 9437 2011-02-04 12:54:47.000Ich möchte aber nur den jüngsten Datensatz zurück.
Ohne Where-Klausel sollte ich dann eine Liste der aktuellen Daten erhalten.Gruß Lars
-
Stelle fest, dass ich es nicht mal hinbekomme nur aus der ProLibraryLink den jüngsten Datensatz zu bekommen.
Vielleicht kann mir da jemand helfen?
Benötigt wird der jüngste Datensatz pro FileID und InstID.
Als Ergebnis sollte ich die DetailID haben.Danke für jede Hilfe!
Gruß Lars
CREATE TABLE [dbo].[ProLibraryLinks]( [LinkID] [bigint] IDENTITY(1,1) NOT NULL, [FileID] [bigint] NULL, [InstID] [bigint] NULL, [DetailID] [bigint] NULL, [LinkDate] [datetime] NULL, CONSTRAINT [PK_ProLibraryLinks] PRIMARY KEY CLUSTERED ( [LinkID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
Test -
Hallo Lars,
use tempdb go create table ProLibraryFiles ( FileID bigint identity not null, InstID bigint not null, FileName varchar not null, ) go create table ProLibraryInstances ( InstID bigint identity not null, FileID bigint not null, LinkDate datetime not null, InstanceName varchar not null ) go create table ProLibraryDetails ( DetailID bigint identity not null, MATNUM bigint not null, DEFTXT varchar not null, ATITLE varchar not null ) go create table ProLibraryLinks ( LinkID bigint identity not null, FileID bigint null, InstID bigint null, DetailID bigint null, LinkDate datetime null ) go declare @instID bigint = 470 declare @fileID bigint = 11 select pld.MATNUM , pld.DEFTXT , pld.ATITLE , pll.InstID , pll.FileID , plf.FileName , pli.InstanceName , pll.LinkID , pll.LinkDate from ProLibraryDetails pld inner join ProLibraryLinks pll on pld.DetailID = pll.DetailID left join ProLibraryFiles plf on pll.FileID = plf.FileID left join ProLibraryInstances pli on pll.InstID = pli.InstID and plf.FileID = pli.FileID where pll.InstID = @instID and pll.FileID = @fileID and pll.LinkDate = (select max(LinkDate) from ProLibraryLinks where FileID = pll.FileID and InstID = pll.InstID ) order by pll.LinkDate desc go --!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -- drop drop table ProLibraryDetails ,ProLibraryFiles ,ProLibraryLinks ,ProLibraryInstances go
- Als Antwort markiert Lamizi Freitag, 11. Februar 2011 07:48
-
Aber dieses Statement habe ich überhaupt nicht verstanden.
die Links könnten Dir villeicht weiterhelfen:
WITH common_table_expression (Transact-SQL)
declare @instID bigint = 470 declare @fileID bigint = 11 ;with t1 as ( select row_number() over (partition by pll.FileID, pll.InstID order by pll.LinkDate desc) as rn , pld.MATNUM , pld.DEFTXT , pld.ATITLE , pll.InstID , pll.FileID , plf.FileName , pli.InstanceName , pll.LinkID , pll.LinkDate from ProLibraryDetails pld inner join ProLibraryLinks pll on pld.DetailID = pll.DetailID left join ProLibraryFiles plf on pll.FileID = plf.FileID left join ProLibraryInstances pli on pll.InstID = pli.InstID and plf.FileID = pli.FileID where pll.InstID = @instID and pll.FileID = @fileID ) select MATNUM , DEFTXT , ATITLE , InstID , FileID , FileName , InstanceName , LinkID , LinkDate from t1 where rn = 1
- Als Antwort vorgeschlagen Uwe RickenMVP Freitag, 11. Februar 2011 06:53