MSSQL 2014 Problem bei Vollständigkeitsprüfung
Hallo,
ich habe drei Tabellen mit folgenden Spalten:
Tabelle1: [Id] ,[Laufendenummer]
Tabelle2: [Id_Tabelle1], [Anzahl Seiten]
Tabelle3: [AngelegtAm], [Paginiernummer]
Jeder Eintrag in Tabelle 1 ist ein Multitif mit genau so vielen Seiten wie in Tabelle2 gespeichert sind
Zu jeder Seite erhalten ich eine Paginiernummer in Tabelle3.
Meine Aufgabe soll es sein sicherzustellen das alle Datensätze die in Tabelle1 enthalten sind die richtige Menge an Datensätze in Tabelle3 haben und umgekehrt.
Sind keine Lücken vorhanden sehen die Tabelle wie folgt aus (Annahme 1 Multitif mit 4 Seiten also 2 Blätter Vorderseiten mit A Rückseiten mit B)
Tabelle 1: Id , [LaufendeNummer]
1 , 12234546[1] --> die 1 entspricht dem Teil der Paginiernummer aus Tabelle 3 welche als Erstes eingelesen wurde
2 , 12234546[3] --> nächstes Multitif
Tabelle 2: [Id_Tabelle1], [Anzahl Seiten]
1 , 4
2 , 6
Tabelle 3: [AngelegtAm], [Paginiernummer]
01.01.2016 ,12234546[1A]
dito ,12234546[1B]
dito ,12234546[2A]
dito ,12234546[2B]
Die LaufendeNummer erhöht sich also nur alle 2 Einträge,
2 Einträge bedeuten jeweils das Vorhandensein von A und B
Insofern muss das Ergebnis der Abfrage lauten das der Eintrag 1 aus Tabelle 1 mit 4 Seiten vollständig in Tabelle 3 vorhanden ist.
Meine Idee war nun das Vorhandensein der 4 Einträge für Id 1 in Tabelle 1 zu "simulieren".
D.h. Ich selektiere die LaufendeNummer aus Tabelle1 und dessen Seitenanzahl.
Danach ergänze ich die LaufendeNummer mit A und B und addieren das nach jeder geraden Seite die LaufendeNummer.
Die Selektion per [LEFT JOIN] würde mich dann zum Ergebnis führen
Quasi :
12234546
([1] + 0) + A (Seite1 Vorderseite)
([1] + 0) + B (Seite1 Rückseite)
([1] + 1) + A (Seite2 Vorderseite)
([1] + 1) + B (Seite2 Rückseite)
Leider habe ich keine Ahnung wie ich das per SQL lösen kann.
Evtl. habt Ihr eine Antwort für mich.
Sofern jemand die Problemstellung verstanden hat.
Vielen Dank schon mal im Voraus
ich habe drei Tabellen mit folgenden Spalten:
Tabelle1: [Id] ,[Laufendenummer]
Tabelle2: [Id_Tabelle1], [Anzahl Seiten]
Tabelle3: [AngelegtAm], [Paginiernummer]
Jeder Eintrag in Tabelle 1 ist ein Multitif mit genau so vielen Seiten wie in Tabelle2 gespeichert sind
Zu jeder Seite erhalten ich eine Paginiernummer in Tabelle3.
Meine Aufgabe soll es sein sicherzustellen das alle Datensätze die in Tabelle1 enthalten sind die richtige Menge an Datensätze in Tabelle3 haben und umgekehrt.
Sind keine Lücken vorhanden sehen die Tabelle wie folgt aus (Annahme 1 Multitif mit 4 Seiten also 2 Blätter Vorderseiten mit A Rückseiten mit B)
Tabelle 1: Id , [LaufendeNummer]
1 , 12234546[1] --> die 1 entspricht dem Teil der Paginiernummer aus Tabelle 3 welche als Erstes eingelesen wurde
2 , 12234546[3] --> nächstes Multitif
Tabelle 2: [Id_Tabelle1], [Anzahl Seiten]
1 , 4
2 , 6
Tabelle 3: [AngelegtAm], [Paginiernummer]
01.01.2016 ,12234546[1A]
dito ,12234546[1B]
dito ,12234546[2A]
dito ,12234546[2B]
Die LaufendeNummer erhöht sich also nur alle 2 Einträge,
2 Einträge bedeuten jeweils das Vorhandensein von A und B
Insofern muss das Ergebnis der Abfrage lauten das der Eintrag 1 aus Tabelle 1 mit 4 Seiten vollständig in Tabelle 3 vorhanden ist.
Meine Idee war nun das Vorhandensein der 4 Einträge für Id 1 in Tabelle 1 zu "simulieren".
D.h. Ich selektiere die LaufendeNummer aus Tabelle1 und dessen Seitenanzahl.
Danach ergänze ich die LaufendeNummer mit A und B und addieren das nach jeder geraden Seite die LaufendeNummer.
Die Selektion per [LEFT JOIN] würde mich dann zum Ergebnis führen
Quasi :
12234546
([1] + 0) + A (Seite1 Vorderseite)
([1] + 0) + B (Seite1 Rückseite)
([1] + 1) + A (Seite2 Vorderseite)
([1] + 1) + B (Seite2 Rückseite)
Leider habe ich keine Ahnung wie ich das per SQL lösen kann.
Evtl. habt Ihr eine Antwort für mich.
Sofern jemand die Problemstellung verstanden hat.
Vielen Dank schon mal im Voraus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 325330
Url: https://administrator.de/contentid/325330
Ausgedruckt am: 16.11.2024 um 11:11 Uhr
9 Kommentare
Neuester Kommentar
Moin StefanLausL,
möglicherweise kannst du diese Dummy-Hilfstabelle etwas einfacher erzeugen.
Meine (ungetestete) Idee wäre in etwa
Da sollte auch eine Tabelle mit einer LfdSeite (also fortlaufende Seitennummer) rausfallen und die "Übersetzung" in eine Paginiernummer.
Den eigentlichen Vergleich über einen Join usw. kannst du so machen wie oben.
Mir scheint allerdings, dass es hier
... statt kleiner wohl kleinergleich sein sollte?
Ich habe in der Skizze auch auf saubere Typkonvertierung verzichtet... wenn der MSSQL-Server bei dir nicht gemeckert hat beim impliziten Casten mit
Brutal, was MS da alles erlaubt... wie sollen die Kidz jemals SQL lernen dabei?
Grüße
Biber
möglicherweise kannst du diese Dummy-Hilfstabelle etwas einfacher erzeugen.
Meine (ungetestete) Idee wäre in etwa
WITH seite AS (
SELECT 1 as lfdseite, '1A' as PaginierNr
UNION ALL
SELECT lfdseite+1, Rtrim(Trunc( (lfdseite+2)/2, 0)) + case when right(paginiernr, 1) = 'A' then 'B' else 'A' end
FROM seite
WHERE lfdseite < 1000
)
SELECT * FROM seite
Den eigentlichen Vergleich über einen Join usw. kannst du so machen wie oben.
Mir scheint allerdings, dass es hier
AND s.num < di.AnzahlSeiten / 2
... statt kleiner wohl kleinergleich sein sollte?
Ich habe in der Skizze auch auf saubere Typkonvertierung verzichtet... wenn der MSSQL-Server bei dir nicht gemeckert hat beim impliziten Casten mit
RTRIM(b.LaufendeNummer + (s.num % 2)) + s.Seite
, dann wird er mir auch verzeihen.Brutal, was MS da alles erlaubt... wie sollen die Kidz jemals SQL lernen dabei?
Grüße
Biber
Moin StefanLausL,
da hätte ich noch einen Tipp.
Die voreingestellte Rekursionstiefe ist 100, die maximale Rekursionstiefe ist 32767.
Du musst einfach nur als neue letzte Zeile ergänzen:
Also in der CTE-Skizze
Statt 4711 natürlich einen Wert, der dir angemessen erscheint.
Grüße
Biber
da hätte ich noch einen Tipp.
Die voreingestellte Rekursionstiefe ist 100, die maximale Rekursionstiefe ist 32767.
Du musst einfach nur als neue letzte Zeile ergänzen:
OPTION (MAXRECURSION 4711)
Also in der CTE-Skizze
With seite as (
...
)
Select from seite
OPTION (MAXRECURSION 4711)
Statt 4711 natürlich einen Wert, der dir angemessen erscheint.
Grüße
Biber