-
Zu deinem (angepassten) Beispiel:
1, 1, 1, 2016, 04, 25, 77
1, 1, 1, 2017, 03, 15, 67
1, 1, 1, 2018, 02, 18, 78
1, 1, 1, 2019, 01, 30, 11
Bekommst du die Gruppe mit
1, 1, 1, 2016, 01, 15, 11
Das glaube ich nicht. Du hast sicher übersehen das in der b selektion
auch das drin ist:
where (ff1, ff2, ff3,
fjj*10000+fmm*100+ftt) in(
select ff1, ff2, ff3, mi from a)
mi ist das min(FJJ*10000+FMM*100+FTT) aus der a selektion
Dadurch habe ich in a nur noch 1, 1, 1, 2016, 04, 25, 77
und ermittel in b nun die 77
(es könnte ja einen 1, 1, 1, 2016, 04, 25, 13 Satz geben, dann würde ich hier die 13 ermitteln)
Oder nicht??
where (feld1, feld2) in(select ...) ist langsamer als
where exists(select * from file where Feld1 = feld1 and feld2 = feld2)??
Danke
DiBe
-
Zu letzter Frage:
Ja, da der "In" alle Daten durchsuchen muss, da auch der letzte Datensatz die Bedingung erfüllen könnte.
Vor allem dann, wenn er nicht zusätzlich durch einen indizierten Where eingeschränkt wird.
Gibt es aber einen Schlüssel für die Where-Klausel des "[not] exists" ist das genau 1 Zugriff.
Den exists gibts halt noch nicht so lange wie den in, so ca. erst 20 Jahre;-).
with a as (
select FF1, ff2, ff3,
min(fjj*10000+fmm*100+ftt) as mi
from datei1
where (ff1, ff2, ff3) in(
select f1, f2, f3
from datei2
where hdkz = 10 )
group by f1, f2, f3),
b as (select ff1, ff2, ff3,
min(fjj), min(fmm), min(ftt), min(fnr) as fnr
from datei1 where
(ff1, ff2, ff3,
fjj*10000+fmm*100+ftt) in(
select ff1, ff2, ff3, mi from a)
group by ff1, ff2, ff3)
select * from b
Deine Einschränkungen der Where-Klauseln ändern daran nun auch nichts.
-
Danke,
du meinst, das der select min(
ERST den absoluten MIN Wert ermittelt und dann nachsieht ob die Bedingung erfüllt ist?
Und wenn nicht den Satz dann verwirft?
m.e. muß er doch erst die Sätze auswählen die der Bedingung entsprechen und aus dieser Teilmenge das Ergebnis bilden!
-
So arbeitet SQL nicht.
SQL erstellt keine temporären Zwischenergebnisse, sondern je Zeile werden alle Verbindungen und Berechnungen durchgeführt.
D.h., die Whereklausel für den Subselect auf a wird vor der Gruppierung und der Berechnung von Aggregaten durchgeführt:
1. Select inkl. aller Joins
2. Where-Klausel je Zeile aus 1.
3. Group By mit Aggregatbildung
4. Having Klausel (where auf Gruppenergebnsse)
Da du ja wahrscheinlich mehr Daten hast, als dein Beispiel oben aufzeigt, kann es trotz der Where-Klausel auf a zu mehreren Zeilen der Gruppe FF1-FF3 kommen.
Daher solltest du
min(fjj), min(fmm), min(ftt), min(fnr) as fnr
durch
min(fjj*10000+fmm*100+ftt) as mi
ersetzen.
Un die FNR dann zu erhalten kannst du den Extrakt via mod(mi, 100) erhalten.
Select b.*, mod(mi, 100) fnr
from b
Similar Threads
-
By Starocotes in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 26-08-20, 15:46
-
By svente in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 22-08-18, 16:34
-
By wti in forum NEWSboard Programmierung
Antworten: 13
Letzter Beitrag: 11-09-15, 12:47
-
By dschroeder in forum NEWSboard Programmierung
Antworten: 10
Letzter Beitrag: 08-01-15, 14:19
-
By malzusrex in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 20-11-14, 14:47
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks