AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Geschachtelte SQL-Abfrage
Thema durchsuchen
Ansicht
Themen-Optionen

Geschachtelte SQL-Abfrage

Ein Thema von HolgerCW · begonnen am 10. Jul 2013 · letzter Beitrag vom 10. Jul 2013
Antwort Antwort
HolgerCW

Registriert seit: 28. Nov 2006
Ort: Marl
1.207 Beiträge
 
Delphi XE7 Enterprise
 
#1

Geschachtelte SQL-Abfrage

  Alt 10. Jul 2013, 08:03
Datenbank: ORACLE • Version: 10 • Zugriff über: BDE
Hallo zusammen,

ich habe folgendes Problem:

SPALTE1 SPALTE2
123456 1
123456 2
123456 3
123555 1
123555 3

Spalte1 ist eine Gerätenummer und Spalte 2 die Zeitscheibennummer. Ich möchte jetzt mit einer SQL-Abfrage herrausfinden, welche Gerätenummer KEINE vortlaufenden Zeitscheiben hat.
Wie kann ich das realisieren ?

Ergebnis oben müsste lauten: 123555
Wenn möglich noch die fehlende Zeitscheibe (Hier: 2) mit ausgeben

MfG

Holger
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Geschachtelte SQL-Abfrage

  Alt 10. Jul 2013, 08:14
Mach ein Join auf dieselbe Tabelle und als Verknüpfungsparameter nimmst Du die Gerätenummer und die Zeitscheibe -1 und fragst auf Existenz ab. So erhältst Du diejenigen VOR DENEN mindestens eine Lücke besteht. Ansonsten müsstest Du evtl. ein Script schreiben.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Geschachtelte SQL-Abfrage

  Alt 10. Jul 2013, 08:15
Nehmen wir mal an, die Tabelle erlaubt pro Gerät keine doppelten Zeitscheibennummern, dann lass doch einfach nach der Gerätenummer gruppieren und vergleiche das Maximum-Minimum von der Zeitscheibennummer (+1) mit der Anzahl der Datensätze
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von nachti1505
nachti1505

Registriert seit: 7. Apr 2007
188 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Geschachtelte SQL-Abfrage

  Alt 10. Jul 2013, 08:19
Hilft dir dabei nicht der "kleine Gauß" vielleicht weiter? http://de.wikipedia.org/wiki/Gau%C3%9Fsche_Summenformel


Unter der Annahme, dass die Zeitscheibenwerte immer bei 1 beginnen, könnte doch folgendes klappen?

Code:
SELECT spalte1 FROM table WHERE (maximum(spalte2)*(maximum(spalte2)+1)/2) <> sum(spalte2)
Ist jetzt keine 1A-SQL-Syntax, sollte aber das Prinzip verdeutlichen. Unter der weiteren Annahme, dass maximal ein Zeitscheibenwert fehlt, bekommst du denn noch durch

Code:
(maximum(spalte2)*(maximum(spalte2)+1)/2) - sum(spalte2)
geliefert.
  Mit Zitat antworten Zitat
HolgerCW

Registriert seit: 28. Nov 2006
Ort: Marl
1.207 Beiträge
 
Delphi XE7 Enterprise
 
#5

AW: Geschachtelte SQL-Abfrage

  Alt 10. Jul 2013, 08:45
Hallo zusammen,

danke schon einmal für die Hinweise. Versuche gerade das auch schon in SQL umzusetzen. Stoße dabei aber auf Probleme. Könnt Ihr mir noch etwas SQL-Code liefern. Wäre super ?

Wie ich die Formel nachti1505 in SQL umsetzen soll, weiß ich auch nicht ?

Bitte noch um ein wenig Unterstützung.

Gruss

Holger
  Mit Zitat antworten Zitat
HolgerCW

Registriert seit: 28. Nov 2006
Ort: Marl
1.207 Beiträge
 
Delphi XE7 Enterprise
 
#6

AW: Geschachtelte SQL-Abfrage

  Alt 10. Jul 2013, 08:50
Habe es jetzt doch hinbekommen. Musste HAVING benutzen.

Delphi-Quellcode:
SELECT GERAET, (MAX(ZEITSCHEIBE)*(MAX(ZEITSCHEIBE)+1)/2) - SUM(ZEITSCHEIBE) AS FEHLENDE_ZEITSCHEIBE
FROM SYSSIGMA.ZST_LAGER
WHERE 1 = 1
HAVING (MAX(ZEITSCHEIBE)*(MAX(ZEITSCHEIBE)+1)/2) <> SUM(ZEITSCHEIBE)
GROUP BY GERAET
Vielen dank an Euch alle.

MfG

holger
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#7

AW: Geschachtelte SQL-Abfrage

  Alt 10. Jul 2013, 09:32
Mit dieser Abfrage bekommst Du nur einen Eintrag pro Gerät. Ist das relevant?
Unter Oracle kannst Du mit
Code:
Lag/Lead, OVER(ORDER BY ..)
gezielt auf Vorgänger/Nachfolger Datensätze zugreifen.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#8

AW: Geschachtelte SQL-Abfrage

  Alt 10. Jul 2013, 09:38
Ich möchte jetzt mit einer SQL-Abfrage herrausfinden, welche Gerätenummer KEINE vortlaufenden Zeitscheiben hat.
fangen wir mal an, alle ohne Nachfolger zu suchen
Code:
select t1.*, t2.zeitscheibe as z1
from #test t1
left outer join #test t2 on t1.nummer=t2.nummer and t1.zeitscheibe=t2.zeitscheibe-1
order by t1.nummer, t1.zeitscheibe
und dasselbe für alle ohne Vorgänger, gleich mit rein verknüpft:
Code:
select t1.*, t2.zeitscheibe as z1, t3.zeitscheibe as z2 
from #test t1
left outer join #test t2 on t1.nummer=t2.nummer and t1.zeitscheibe=t2.zeitscheibe-1
left outer join #test t3 on t1.nummer=t3.nummer and t1.zeitscheibe=t3.zeitscheibe+1
order by t1.nummer, t1.zeitscheibe
jetzt kann man an den fehlenden Inhalten der Spalten z1 und z2 erkennen, wer keinen Vorgänger bzw Nachfolger hat:
Code:
select t1.*, t2.zeitscheibe as z1, t3.zeitscheibe as z2 
from #test t1
left outer join #test t2 on t1.nummer=t2.nummer and t1.zeitscheibe=t2.zeitscheibe-1
left outer join #test t3 on t1.nummer=t3.nummer and t1.zeitscheibe=t3.zeitscheibe+1
where (t2.zeitscheibe is null) and (t3.zeitscheibe is null)
order by t1.nummer, t1.zeitscheibe
welche Zeitscheibe fehlt, ist dann nur noch Mengenlehre
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de

Geändert von joachimd (10. Jul 2013 um 09:39 Uhr) Grund: Typo
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz