Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Hilfe bei Abfrage, bzw. Datenumstrukturierung (https://www.delphipraxis.net/187899-hilfe-bei-abfrage-bzw-datenumstrukturierung.html)

baumina 13. Jan 2016 14:32

Datenbank: mysql • Version: 5.6 • Zugriff über: UniDAC

Hilfe bei Abfrage, bzw. Datenumstrukturierung
 
Meine Lieben,

Folgende Abfrage muss ich so ändern, dass ich ausschließlich JOINs verwenden kann. Wenn das mit der Änderung nicht so klappt, kann ich auch die Datenstruktur ändern, damit ich das hinbekomm.

Etwas vereinfacht dargestellt, sehen meine Tabellen so aus
- Baugruppen : TBLBG
- pro Baugruppe Einträge in der Stückliste : TBLPLMSL (das Feld "Bearbeitungsart" muss hier näher betrachtet werden)

- Gruppen von Bearbeitungsarten : tblfeidxgrp
- Bearbeitungsarten innerhalb der Gruppen : tblfeidxgrpdet

Daten, die die Abfrage liefern soll:
Es sollen alle Einträge aus der Stückliste angezeigt werden, bei denen die Bearbeitungsart weder in der Bearbeitungsgruppe "SMD B-Seite" noch in der Gruppe "SMD L-Seite" zu finden ist.

EDIT:
Eine Bearbeitungsart kann mehreren Gruppen zugeordnet sein.
Jedes Teil hat nur eine Bearbeitungsart.
In der Tabelle tblfeidxgrpdet sind nicht alle Bearbeitungsarten, die es in der Stückliste geben kann definiert.

Eine extra Gruppe "Nicht SMD" mit allen sonstigen Bearbeitungsarten kann ich nicht in Betracht ziehen.

Hier meine jetzige Abfrage mit SubSelect (die durch JOINs ersetzt werden muss):

SQL-Code:
SELECT *
FROM TBLBG, TBLPLMSL
WHERE TBLPLMSL.BGID = TBLBG.BGID
  AND TBLPLMSL.Bearbeitungsart NOT IN
      (SELECT tblfeidxgrpdet.FEIndex FROM tblfeidxgrpdet
                                        , tblfeidxgrp tblfeidxgrp
                                     WHERE tblfeidxgrp.FEIDXGRPID = tblfeidxgrpdet.FEIDXGRPID
                                      AND tblfeidxgrp.Gruppenname IN ('SMD B-Seite','SMD L-Seite')
      )

Uwe Raabe 13. Jan 2016 15:12

AW: Hilfe bei Abfrage, bzw. Datenumstrukturierung
 
Aus naheliegenden Gründen ungetestet:

SQL-Code:
SELECT TBLBG.*, TBLPLMSL.*
FROM TBLBG
JOIN TBLPLMSL ON TBLBG.BGID = TBLPLMSL.BGID
JOIN tblfeidxgrpdet ON tblfeidxgrpdet.FEIndex = TBLPLMSL.Bearbeitungsart
JOIN tblfeidxgrp ON tblfeidxgrp.FEIDXGRPID = tblfeidxgrpdet.FEIDXGRPID
WHERE NOT (tblfeidxgrp.Gruppenname IN ('SMD B-Seite','SMD L-Seite'))

Blup 13. Jan 2016 15:15

AW: Hilfe bei Abfrage, bzw. Datenumstrukturierung
 
Unter der Annahme das jedem Teil nur einer Bearbeitungsart zugeordnet ist und jede Bearbeitungsart nur einer Bearbeitungsgruppe angehören kann.

Uwe Raabe 13. Jan 2016 15:20

AW: Hilfe bei Abfrage, bzw. Datenumstrukturierung
 
Zitat:

Zitat von Blup (Beitrag 1326877)
Unter der Annahme das jedem Teil nur einer Bearbeitungsart zugeordnet ist und jede Bearbeitungsart nur einer Bearbeitungsgruppe angehören kann.

Genau das interpretiere ich aus den Feldern TBLPLMSL.Bearbeitungsart und tblfeidxgrpdet.FEIDXGRPID.

baumina 13. Jan 2016 15:20

AW: Hilfe bei Abfrage, bzw. Datenumstrukturierung
 
Zitat:

Zitat von Blup (Beitrag 1326877)
Unter der Annahme das jedem Teil nur einer Bearbeitungsart zugeordnet ist und jede Bearbeitungsart nur einer Bearbeitungsgruppe angehören kann.

Ja, hab ich vergessen zu erwähnen:
Eine Bearbeitungsart kann mehreren Gruppen zugeordnet sein.
Jedes Teil hat nur eine Bearbeitungsart.
In der Tabelle tblfeidxgrpdet sind nicht alle Bearbeitungsarten, die es in der Stückliste geben kann definiert.

Uwe Raabe 13. Jan 2016 15:27

AW: Hilfe bei Abfrage, bzw. Datenumstrukturierung
 
Zitat:

Zitat von baumina (Beitrag 1326880)
Eine Bearbeitungsart kann mehreren Gruppen zugeordnet sein.
Jedes Teil hat nur eine Bearbeitungsart.
In der Tabelle tblfeidxgrpdet sind nicht alle Bearbeitungsarten, die es in der Stückliste geben kann definiert.

OK, das sind dann andere Voraussetzungen.

frankyboy1974 13. Jan 2016 15:36

AW: Hilfe bei Abfrage, bzw. Datenumstrukturierung
 
hallo,

ich weiss nicht ob das bezogen auf die Datenbank funktioniert, aber mein Ansatz wäre grundsätzlich wie der von Uwe. Nur das du Feld Gruppenname mittels Case Block in ein Integer umwandelts. Die Gruppen die nicht vorhanden sein dürfen, wandels du in 1 um, alle anderen in eine 0. Dann gruppierst du die Werte mit Group by, und als Abschluss dann noch die having-Klausel etwa so 'having sum(Feld)=0'

mfg

jobo 13. Jan 2016 16:29

AW: Hilfe bei Abfrage, bzw. Datenumstrukturierung
 
"not in" umgestellt als "left outer" mit Condition Outer Menge "is null"
Code:
SELECT *
  FROM TBLBG bg
  join TBLPLMSL pm
    on bg.BGID = pm.BGID
  left join (SELECT tblfeidxgrpdet.FEIndex
               FROM tblfeidxgrpdet, tblfeidxgrp tblfeidxgrp
              WHERE tblfeidxgrp.FEIDXGRPID = tblfeidxgrpdet.FEIDXGRPID
                AND tblfeidxgrp.Gruppenname IN
                    ('SMD B-Seite', 'SMD L-Seite')) x
    on pm.Bearbeitungsart = x.FEIndex
 where FEIndex is null
Müsste im Prinzip so gehen, formal, ich garantiere aber nichts.

P.S: Ist also Dein Originalstatement ohne Optimierung oder Annahmen, nur anderes Verfahren

jobo 13. Jan 2016 18:50

AW: Hilfe bei Abfrage, bzw. Datenumstrukturierung
 
x könnte man noch so zu join umstellen

Code:
(
SELECT tblfeidxgrpdet.FEIndex
  FROM tblfeidxgrpdet,
       tblfeidxgrp tblfeidxgrp,
       (Select 'SMD B-Seite' as Gruppenname union all 'SMD L-Seite') grp
 WHERE tblfeidxgrp.FEIDXGRPID = tblfeidxgrpdet.FEIDXGRPID
   AND tblfeidxgrp.Gruppenname = grp.Gruppenname
) x
Darf man fragen, warum das sein muss?
Performance? Dann ist zumindest die X Umstellung in diesem Post wahrscheinlich wurscht.
Neue hausinterne Datenabfrageverordnung?

Einen Tabellenumbau würde ich jedenfalls wegen eine SQL Formulierung nicht in Erwägung ziehen. Vorausgesetzt, der Tabellenaufbau ist state of the art. Vermutlich kann man sowieso alle ins und not ins in joins umwandeln.

baumina 14. Jan 2016 06:12

AW: Hilfe bei Abfrage, bzw. Datenumstrukturierung
 
Grund der gewünschten Umstellung ist mein Reportbuilder, der mir keine Filterfunktion zur Verfügung stellt, wenn ich einen SQL-Befehl nicht automatisch (durch zusammenklicken der Tabellen und Felder via Abfrageassistent), sondern manuell erstelle. Alle bisher genannten subselects müsste ich wie meine momentane Lösung manuell eintragen.

Vielleicht müsste ich nur meine Datenstruktur ändern, um das gewünschte zu erreichen. Folgende Bearbeitungsarten müssen unterschieden werden, wobei nur die SMD-Arten bekannt sind.

Gruppe SMD B-Seite hat : gu, gupr, smd2, st
Gruppe SMD L-Seite hat : gul, smd2, stl
Die Stücklisten haben : auf, kl, gu, gupr, uvm.

Die SMD-Stücklisten bekomme ich ganz einfach durch JOINS nur die Nicht-SMD-Stückliste macht mir den Kummer. Wenn mein Reportbuilder nicht so doof wär, wär das alles kein Problem :cry:

Dejan Vu 14. Jan 2016 06:21

AW: Hilfe bei Abfrage, bzw. Datenumstrukturierung
 
[OT]
Warum sind Tabellen- und Spaltennamen bei kommerziellen Programmen eigentlich vorzugsweise unleserlich? :wall:
tblpg, tblplsml, tblfeidxgrpdet, tblfeidxgrp? WTF.
[/OT]

Perlsau 14. Jan 2016 06:32

AW: Hilfe bei Abfrage, bzw. Datenumstrukturierung
 
Das habe ich vor ziemlich genau 5 Jahren einen Mitarbeiter eines Software-Herstellers gefragt, und er antwortete, damit potentielle Hacker es schwerer haben. Damals leuchtete mir das ein, kannte ich doch den Begriff security by obscurity noch nicht. Heute würde ich entgegenhalten, daß das keinen Hacker aufhalten kann.

Dejan Vu 14. Jan 2016 06:35

AW: Hilfe bei Abfrage, bzw. Datenumstrukturierung
 
Nee, oder? Das wäre das Letzte, was mir in den Sinn gekommen wäre (also die Antwort von dem Softwarehersteller). Gut OT. Lassen wir es bei kontinuierlichem Kopfschütteln.

baumina 14. Jan 2016 06:49

AW: Hilfe bei Abfrage, bzw. Datenumstrukturierung
 
Dass du dich an den Tabellennamen störst ist natürlich ein echtes Problem.

Hier mein SQL-Befehl mit (hoffentlich) ansprechenderen Tabellen- und Feldnamen:

SQL-Code:
SELECT *
FROM Baugruppe, StueckListe
WHERE StueckListe.BaugruppenID = Baugruppe.BaugruppenID
   AND StueckListe.Bearbeitungsart NOT IN
       (SELECT Bearbeitungsart FROM BearbeitungsartGruppeDetail
                                  , BearbeitungsartGruppe
         WHERE BearbeitungsartGruppe.GruppenID = BearbeitungsartGruppeDetail.GruppenID
           AND BearbeitungsartGruppe.Gruppenname IN ('SMD B-Seite','SMD L-Seite')
       )

jobo 14. Jan 2016 07:45

AW: Hilfe bei Abfrage, bzw. Datenumstrukturierung
 
Zitat:

Zitat von baumina (Beitrag 1326949)
Grund der gewünschten Umstellung ist mein Reportbuilder, der mir keine Filterfunktion zur Verfügung stellt, wenn ich einen SQL-Befehl nicht automatisch (durch zusammenklicken der Tabellen und Felder via Abfrageassistent), sondern manuell erstelle. Alle bisher genannten subselects müsste ich wie meine momentane Lösung manuell eintragen.

Vielleicht müsste ich nur meine Datenstruktur ändern, um das gewünschte zu erreichen.

Die SMD-Stücklisten bekomme ich ganz einfach durch JOINS nur die Nicht-SMD-Stückliste macht mir den Kummer. Wenn mein Reportbuilder nicht so doof wär, wär das alles kein Problem :cry:

Ok, ich habe oben die Statements in Joins umgewandelt. Was ist damit?
Du überlegst ernsthaft, die Datenstruktur für einen unfähigen Reportbuilder zu ändern?
Kann es sein, dass Du nur die No-Cost Variante verwendest und dafür gerade bluten musst?

baumina 14. Jan 2016 08:11

AW: Hilfe bei Abfrage, bzw. Datenumstrukturierung
 
Zitat:

Zitat von jobo (Beitrag 1326964)
Ok, ich habe oben die Statements in Joins umgewandelt. Was ist damit?

Kann ich leider im Reportbuilder so nicht zusammenklicken.
Zitat:

Zitat von jobo (Beitrag 1326964)
Du überlegst ernsthaft, die Datenstruktur für einen unfähigen Reportbuilder zu ändern?

Dieser Teil der Datenstruktur ist neu und soll deswegen gut überlegt sein.
Zitat:

Zitat von jobo (Beitrag 1326964)
Kann es sein, dass Du nur die No-Cost Variante verwendest und dafür gerade bluten musst?

Nein, der Reportbuilder wurde gekauft, allerdings ist er nicht auf der neuesten Version.

Ich danke euch allen fürs Lesen, ich versuche gerade einen anderen Weg mit meinem Reportbuilder, macht euch also keine weiteren Gedanken.

------ geschlossen ------


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:58 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