Benutzer mit den meisten Antworten
Unterabfrage

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
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
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 -
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,201Uwe
Mittelung vom Forum
-
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