none
Unterabfrage RRS feed

  • Frage

  • Es geht um das Beispiel Urlaubsbeantragung. Ich habe zwei Tabellen, eine mit den Daten von...bis und eine zweite mit der Historie des Status (eingereicht, befürwortet, genehmigt), wer und wann geschaltet.

    Nun möchte ich eine Auswertung, die mir je Antrag den akt. Status und wer und wann diesen geschaltet hat. Meine Abfrage sieht so aus:

    Select von,bis,stat,datum,pnr
                From Urlaub Join (Select Top 1 url_id,stat,datum,pnr From Url_Stat Order by datum DESC) t1 On url_id=Urlaub.id_nr Where ...

    Hier soll die Unterabfrage den jeweiligen letzten Eintrag liefern. Macht sie aber nicht.

    Wie geht das besser?

    Uwe


    Mittelung vom Forum

    Mittwoch, 30. November 2016 09:29

Antworten

  • Hallo Uwe,

    was hältst Du von einer CTE?

    With Vorberechnung as
     (Select url_id,stat,datum,pnr, ROW_NUMBER() OVER(PARTITION BY url_id ORDER BY DATUM DESC) as rn 
    	From Url_Stat 
     )
     Select u.von, u.bis, v.stat, v.datum, u.pnr, v.pnr
     From Urlaub u
     Inner Join Vorberechnung v 
    	On url_id=u.id_nr
    	and v.rn = 1; 



    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu


    • Bearbeitet Christoph Muthmann Mittwoch, 30. November 2016 10:25 Statement geändert
    • Als Antwort markiert uwe domschke Mittwoch, 30. November 2016 12:39
    Mittwoch, 30. November 2016 10:16

Alle Antworten

  • Hallo Uwe,

    Du bist doch schon etwas länger dabei, daher weißt Du doch, dass wir mehr brauchen als "geht nicht".

    Poste bitte die CREATE TABLE Statements deiner zwei Tabellen, INSERT INTO Statements für die Beispieldaten und ausgehend von diesen Beispieldaten bitte das gewünschte Ergebnis. Dann schauen wir uns das auch gerne mal an.

    So angemerkt: Dein Join kann nicht so funktionieren wie Du das denkst, da Du im Subselect lediglich einen einzigen Datensatz aus der gesamten Tabelle ausliest und nicht, wie es wahrscheinlich gewünscht ist, einen Datensatz pro "pnr". Das müsstest Du daher in eine WHERE Klausel im Subselect reinbringen.


    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

    Mittwoch, 30. November 2016 09:43
    Moderator
  • Hallo Stefan,

    Du hast recht und Dein letzter Satz trifft es: So gibt die Unterabfrage nur einen Datensatz. Die Unterabfrage sollte einen Datensatz pro "url_id" bringen, was die Verknüpfung zu "Urlaub.id_nr ist.

    Mein Problem ist, dass das nach "On" (url_id=Urlaub.id_nr) eigentlich in das "Where" in der Unterabfrage verwendet werden müsste. Was mache ich dann aber bei der On-Verknüpfung?

    CREATE TABLE [dbo].[Urlaub](
     [id_nr] [int] IDENTITY(1,1) NOT NULL,
     [pnr] [int] NOT NULL,
     [von] [smalldatetime] NULL,
     [bis] [smalldatetime] NULL,
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

    CREATE TABLE [dbo].[Url_Stat](
     [id_ustat] [int] IDENTITY(1,1) NOT NULL,
     [url_id] [int] NULL,
     [stat] [tinyint] NULL,
     [datum] [date] NULL CONSTRAINT [DF_Url_Stat_datum]  DEFAULT (getdate()),
     [pnr] [int] NULL,
     CONSTRAINT [PK_Url_Stat] PRIMARY KEY CLUSTERED
    (
     [id_ustat] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    Declare @id int
    Insert Into Urlaub (pnr,von,bis) Values (100,'30.9.16','10.12.16');Select @id=SCOPE_IDENTITY()
    Insert Into Url_Stat(url_id,stat,pnr) Select @id,1,200
    Insert Into Url_Stat(url_id,stat,pnr) Select @id,2,201

    Uwe


    Mittelung vom Forum

    Mittwoch, 30. November 2016 10:06
  • Hallo Uwe,

    was hältst Du von einer CTE?

    With Vorberechnung as
     (Select url_id,stat,datum,pnr, ROW_NUMBER() OVER(PARTITION BY url_id ORDER BY DATUM DESC) as rn 
    	From Url_Stat 
     )
     Select u.von, u.bis, v.stat, v.datum, u.pnr, v.pnr
     From Urlaub u
     Inner Join Vorberechnung v 
    	On url_id=u.id_nr
    	and v.rn = 1; 



    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu


    • Bearbeitet Christoph Muthmann Mittwoch, 30. November 2016 10:25 Statement geändert
    • Als Antwort markiert uwe domschke Mittwoch, 30. November 2016 12:39
    Mittwoch, 30. November 2016 10:16
  • Hallo Christoph,

    gute Idee - funktioniert. Danke


    Mittelung vom Forum

    Mittwoch, 30. November 2016 12:39