AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken in-Klausel in großen Tabellen

in-Klausel in großen Tabellen

Ein Thema von Ykcim · begonnen am 8. Feb 2019 · letzter Beitrag vom 11. Feb 2019
Antwort Antwort
Seite 2 von 3     12 3   
jobo

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

AW: in-Klausel in großen Tabellen

  Alt 8. Feb 2019, 12:19
Es sollen aber alle Sätze zu den AuftragsNr angezeigt werden, zu denen "auch" einen Satz aus dem Jahr 2018 existiert und nicht "nur" die Sätze aus dem Jahr 2018. Man kommt also an einem IN oder einem adäquaten Join-Konstrukt nicht vorbei.
Ja, Du hast Recht, hab ich übersehen.
Also
Code:
select *
  from Auftragsdaten A
  join Auftragsdaten A2018
    on A.AuftragsNr = A2018.AuftragsNr
 where A2018.Fertigdatum between :anfang and :ende
@DeddyH: Ich beschwer mich nicht, hab es ja tatsächlich nicht mal halbwegs formatiert und ja.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#2

AW: in-Klausel in großen Tabellen

  Alt 8. Feb 2019, 11:52
Code:
select * from tabelle where Fertigdatum > 20180000 and fertigdatum < 20190000
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#3

AW: in-Klausel in großen Tabellen

  Alt 8. Feb 2019, 12:29
Code:
select * from tabelle where Fertigdatum > 20180000 and fertigdatum < 20190000

ok, dann so, wenn der Vorgang komplett drin sein sollte ohne Parameter usw. nur schematisch...


Code:
select * from tabelle where (Fertigdatum > 20180000 and fertigdatum < 20190000) and (Fertigdatum < 20180000 or fertigdatum > 20190000)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.739 Beiträge
 
Delphi 6 Enterprise
 
#4

AW: in-Klausel in großen Tabellen

  Alt 8. Feb 2019, 12:38
@Jobo: Wird der Join nicht zu groß (Kreuzprodukt)?

Sinngemäß ginge vllt. sowas:
SQL-Code:
Select B.* From
(Select Distinct Auftragsnummer From Tabelle Where Datum between 010118 und 311218) A
Left Join Tabelle B
On B.Auftragsnummer=A.Auftragsnummer
Ralph

Geändert von Jumpy ( 8. Feb 2019 um 12:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.658 Beiträge
 
Delphi 12 Athens
 
#5

AW: in-Klausel in großen Tabellen

  Alt 8. Feb 2019, 12:44
In allen mir bekannten DBMS ist ein JOIN ohne weitere Angaben automatisch ein INNER JOIN. Das Kreuzprodukt erhält man mit CROSS JOIN (wobei mir dafür bislang noch kein Anwendungsfall begegnet ist).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#6

AW: in-Klausel in großen Tabellen

  Alt 8. Feb 2019, 12:47
Oder doch eher dashier?
SQL-Code:
select a.*
  from Auftragsdaten A
  join Auftragsdaten A2018
    on A.AuftragsNr = A2018.AuftragsNr
 where A2018.Fertigdatum between :anfang and :ende
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#7

AW: in-Klausel in großen Tabellen

  Alt 8. Feb 2019, 12:53
Hallo Zusammen,

vielen Dank für das toll Feedback!!!

Ich habe verschiedene Vorschläge geprüft, aber ich glaube, die richtige Lösung war noch nicht dabei.

Meine Schwierigkeit liegt darin, dass ich alle Arbeitsgänge von allen Aufträgen aus einem Jahr aufgelistet haben möchte, wo mindestens 1 Arbeitsgang in dem ausgewählten Jahr fertig geworden ist. Die Arbeitsgänge, die durch einen Jahreswechsel im vorherigen oder nachfolgenden Jahr fertig wurden, möchte ich auch haben. Sobald ein Arbeitsgang in dem ausgewählten Jahr fertig wurde möchte ich immer alle Arbeitsgänge, die zu dem Auftrag gehören ausgewiesen bekommen.

Es geht also nicht nur um die Arbeitsgänge, die im ausgewählten Jahr fertig wurden, sondern auch um die "Geschwister-Arbeitsgänge" des Aufrags, egal wann die fertig wurden. Deshalb hatte ich es mit der IN-Funktion probiert...

Vielen Dank!
Patrick
Patrick

Geändert von Ykcim ( 8. Feb 2019 um 12:56 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#8

AW: in-Klausel in großen Tabellen

  Alt 8. Feb 2019, 13:08
Was stimmt den jetzt bei den Vorschlägen nicht: Die Geschwindigkeit oder das Ergebnis?

Alle AuftragsNr aus 2018 werden gesucht:
select distinct AuftragsNr from tabelle where Fertigdatum between 20180000 and 20181231 und nun aus der Tabelle alle die, deren AuftragsNr im obigen Ergebnis enthalten ist:
SQL-Code:
select * from tabelle where AuftragsNr in (
  select distinct AuftragsNr from tabelle where Fertigdatum between 20180000 and 20181231
)
Soweit so richtig so langsam?

Von welchem Datentyp ist eigentlich Fertigdatum?
Und auf welchen der für die Abfrage benötigten Spalten gibt es einen Index bzw. keinen Index?
Und wie sehen die entsprechenden Indexdefinitionen aus?
Um was für eine Datenmenge handelt es sich?
Ein paar Dutzend, ein paar hundert, ein paar Tausend, etliche Millionen?

Und ja: Uwe Raabe hat recht: Eigentlich sind die Infos vieeeeeeeel zu dürftig, um sinnvolle Hilfestellung geben zu können.

Vollständiges Createstatement für die Tabelle und Mengenangaben (incl. erwarteter Ergebnismenge und ggfls. erwarteten Zuwächsen für die "restliche Lebenszeit des Programmes") wären hilfreich.
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
714 Beiträge
 
Delphi 12 Athens
 
#9

AW: in-Klausel in großen Tabellen

  Alt 11. Feb 2019, 10:14
Zitat:
select * from tabelle
where AuftragNr in (
select AuftragNr from Tabelle where Year(FertigDatum) = 2018 group by AuftragNr)
Wozu das group by in der inneren query? Eventuell funktioniert das hier besser:

Code:
select distinct <feldliste> from tabelle
where exists (
select AuftragNr from Tabelle where Year(FertigDatum) = 2018)
order by auftragnr, arbeitsgang
Ich hatte allerdings auch schon Fälle, wo es nicht anders ging als ein Zwischenergebnis in einer temporären Tabelle zu speichern. In deinem Fall würde man da
das Resultat von

Code:
select distinct AuftragNr from Tabelle where Year(FertigDatum) = 2018)
ablegen. Diese Query gibt halt deutlich weniger Zeilen zurück als ohne "distinct", ist aber aufwendiger in der Verarbeitung.
Peter Below
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
273 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: in-Klausel in großen Tabellen

  Alt 11. Feb 2019, 12:56
Also ich würde folgendes tun:

1. Ein Feld "Jahr" einführen und entsprechend füllen
2. Einen Index für das Feld "Jahr" anlegen
3. Anschließend folgende Abfrage ausprobieren:

Code:
SELECT * FROM tabelle a
INNER JOIN (
  SELECT DISTINCT AuftragNr FROM Tabelle where Jahr = 2018) i ON a.AuftragNr = i.AuftragNr
ORDER BY auftragnr, arbeitsgang
4. Falls das nicht performant ist, dann das Ergebnis der inneren Abfrage vorher in einer (temporären) Tabelle zwischenspeichern (in dieser Tabelle den Index auf AuftragNr nicht vergessen!) und dann die obengenannte Abfrage auf die temporäre Tabelle machen. Das würde dann ungefähr so aussehen:

Code:
CREATE TEMPORARY TABLE `temptable` (
  `AuftragNr` int(11),
  PRIMARY KEY (`AuftragNr`)
) ENGINE=InnoDB;
                 
INSERT INTO `temptable` 
  SELECT DISTINCT AuftragNr FROM Tabelle where Jahr = 2018;

SELECT * FROM `tabelle` a
INNER JOIN `temptable` i ON a.AuftragNr = i.AuftragNr
ORDER BY AuftragNr, arbeitsgang;

DROP TEMPORARY TABLE `temptable`;
Wenn diese Statements zusammen nicht innerhalb eines Fingeschnippsens durch sind, fresse ich einen Besen...

PS1: Ich habe nicht alle vorherigen Antworten komplett durchgelesen, vielleicht wiederhole ich auch nur bereits Gesagtes.
PS2: Ich habe die Statements nicht ausprobiert.
[Delphi 11.3.1 Enterprise; Win10/11; MySQL; VCL]
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 02:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz