Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte » 

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   in-Klausel in großen Tabellen (https://www.delphipraxis.net/199645-klausel-grossen-tabellen.html)

Ykcim 8. Feb 2019 10:58

Datenbank: MySQL • Version: 5 • Zugriff über: UniDac

in-Klausel in großen Tabellen
 
Hallo Zusammen,

ich komme bei einer Abfrage leider nicht weiter und bitte Euch um Hilfe.

Ich habe eine sehr große Tabelle mit Auftragsdaten aus mehrere Jahren. Die Tabelle ich so vereinfacht aufgebaut:

AuftragsNr-----Arbeitsgang------Fertigdatum
4710815------------10------------20181215
4710815------------20------------20181218
4710815------------30------------20181223
4710815------------40------------20190110
4710815------------50------------20190115
7878787------------10------------20181015
7878787------------20------------20181018
7878787------------30------------20181023
7878787------------40------------20181110
7878787------------50------------20181115
5656565------------10------------20190115
5656565------------20------------20190118
5656565------------30------------20190123
5656565------------40------------20190210
5656565------------50------------20190215
andere Aufträge.

Ich brauche jetzt eine Abfrage, die mir alle Aufträge mit allen Arbeitsgänge auswirft, die bei einem Arbeitsgang das Fertigdatum in 2018 haben.
Also soll das Ergebnis so aussehen:
AuftragsNr-----Arbeitsgang------Fertigdatum
4710815------------10------------20181215
4710815------------20------------20181218
4710815------------30------------20181223
4710815------------40------------20190110
4710815------------50------------20190115
7878787------------10------------20181015
7878787------------20------------20181018
7878787------------30------------20181023
7878787------------40------------20181110
7878787------------50------------20181115

Den Auftrag 5656565 nicht, weil er keinen Arbeitsgang hat, der in 2018 abgeschlossen wurde.

Mein Versuch
Delphi-Quellcode:
select * from tabelle
where AuftragNr in (
select AuftragNr from Tabelle where Year(FertigDatum) = 2018 group by AuftragNr)
Aber weil die Tabelle recht groß ist, raucht mir die Abfrage ab. Hat jemand eine schlauere Lösung, die ich ausprobieren könnte?

Vielen Dank
Patrick

Delphi.Narium 8. Feb 2019 11:10

AW: in-Klausel in großen Tabellen
 
eventuell sowas?
SQL-Code:
select * from tabelle a where exists (select 1 from tabelle b where Year(b.Fertigdatum) = 2018 and a.AuftragsNr = b.AuftragsNr)

DasWolf 8. Feb 2019 11:15

AW: in-Klausel in großen Tabellen
 
Ist es unbedingt notwendig, eine Unterabfrage zu verwenden?

jobo 8. Feb 2019 11:16

AW: in-Klausel in großen Tabellen
 
ich sehe da nicht, warum Du ein "where in" brauchst, wenn es auf einundderselben Tabelle abgefragt wird.

Außerdem würde ich ein "where in" -das m.E. nur für sowas wie "enums" gedacht ist bei großen Mengen immer als Join umformen.

Zuletzt würde ich niemals bei derartigen Abfragen mit Funktionen wie year() arbeiten. Derartiges immer mit einer Bereichsabfrage "<datefield> between <vondate> and <bisdate>" damit sollte es auf jeden Fall flott sein, wenn auf dem Datefield ein Index liegt und der Zugriff darauf nicht durch andere Sachen vermasselt wird.

Delphi.Narium 8. Feb 2019 11:24

AW: in-Klausel in großen Tabellen
 
Also eher sowas?
SQL-Code:
select * from tabelle a where exists (
  select 1 from tabelle b
  where a.AuftragsNr = b.AuftragsNr
  and b.Fertigdatum between CAST('2018-01-01' AS DATE) and CAST('2018-12-31' AS DATE)
)

ibp 8. Feb 2019 11:52

AW: in-Klausel in großen Tabellen
 
Code:
select * from tabelle where Fertigdatum > 20180000 and fertigdatum < 20190000

DasWolf 8. Feb 2019 11:56

AW: in-Klausel in großen Tabellen
 
Eher so:

SQL-Code:
select * from tabelle where Fertigdatum >= '2018-01-01' and Fertigdatum <= '2018-12-31'

haentschman 8. Feb 2019 12:01

AW: in-Klausel in großen Tabellen
 
Zitat:

Eher so:
Nö...nur mit Parametern aktzeptabel. :zwinker:

DeddyH 8. Feb 2019 12:04

AW: in-Klausel in großen Tabellen
 
Ich will auch mal:
Delphi-Quellcode:
SELECT [Feldliste] FROM [Tabelle] WHERE Fertigdatum BETWEEN :anfang AND :ende

jobo 8. Feb 2019 12:05

AW: in-Klausel in großen Tabellen
 
sag ich doch
;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:18 Uhr.
Seite 1 von 5  1 23     Letzte » 

Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf