none
Aktuellen Datensatz: mehrere verknüpfte Tabellen RRS feed

  • 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 InstID

    Zu 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

    Donnerstag, 10. Februar 2011 06:56

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
    Donnerstag, 10. Februar 2011 17:55

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 = 1

    sollte 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.

    Donnerstag, 10. Februar 2011 07:26
  • 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 DESC

    WHERE-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.000

    Ich möchte aber nur den jüngsten Datensatz zurück.
    Ohne Where-Klausel sollte ich dann eine Liste der aktuellen Daten erhalten.

    Gruß Lars

    Donnerstag, 10. Februar 2011 08:13
  • 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
    Donnerstag, 10. Februar 2011 13:37
  • 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
    Donnerstag, 10. Februar 2011 17:55
  • Aber dieses Statement habe ich überhaupt nicht verstanden.

     

    die Links könnten Dir villeicht weiterhelfen:

    OVER Clause (Transact-SQL)

    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
    Donnerstag, 10. Februar 2011 18:19
  • Super! Vielen herzlichen Dank für die Bemühungen!!!

    Funktioniert prima!

     

    Gruß Lars


    Test
    Freitag, 11. Februar 2011 06:27