SQL-Abfrage..

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

SQL-Abfrage..

Beitrag von techniker »

Hi,

irgendwie sitze ich momentan auf der Leitung.. :roll:

Ich will eine SQL-Anweisung entwerfen, die mir eine Liste ausgewählter Spalten von Tabelle 1 in Abhängigkeit von Tabelle 2 ausgibt.
In Tabelle 1 werden div. Messdaten und in Tabelle 2 alle Events, welche sich auf Zeilen (=ID) in Tabelle 1 beziehen, abgelegt.

Tabelle 1 enthält eine Spalte ID, welcher der Primärschlüssel ist.
Die restl. Spalten sind irrelevant für die Abfragebedingung.

Tabelle 2 sieht so aus:
ID = Primärschlüssel, AutoIncrement (wird nicht weiter verwendet)
Tab1_ID = verweist auf zugehörige Zeile (=ID) in Tabelle 1
Event_Type = Was ist passiert? ("EV1", "EV2", "EV3", ..)
Event_Date = Wann ist es passiert?

In Tabelle 2 kann es VIELE Records geben, die sich auf eine Zeile (=ID) in Tabelle 1 beziehen.
(Aktuell enthält Tabelle 2 etwa 2Mio. Einträge und es werden stetig mehr..)

Und nun die Bedingungen die mir Kopfschmerzen bereiten:
Ich will alle Einträge aus Tabelle 1 selektieren, bei denen ein bestimmtes Ereignis "EV1" bereits eingetreten, aber noch kein Ereignis "EV3" eingetreten ist.

Kann mir hier jemand auf die Sprünge helfen, wie ich das effektiv löse, ohne die ganze Tabelle in PB auswerten zu müssen? :cry:
Ich würde diese Arbeit lieber der DB-Engine (MySQL) überlassen und zusätzlich das Netzwerk schonen.. :wink:

Danke!
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: SQL-Abfrage..

Beitrag von techniker »

Tabelle 1:

ID | MW1 | MW2 | ...
=================
100 | xyz | xyz | ...
101 | xyz | xyz | ...
102 | xyz | xyz | ...
103 | xyz | xyz | ...




Tabelle 2:

ID | Tab1_ID | Event_Type | Event_Date
===============================
20 | 100 | EV1 | Datum
21 | 103 | EV1 | Datum
22 | 102 | EV2 | Datum
23 | 103 | EV1 | Datum
24 | 101 | EV2 | Datum
25 | 100 | EV1 | Datum
26 | 103 | EV3 | Datum
27 | 100 | EV1 | Datum
28 | 102 | EV1 | Datum
29 | 101 | EV2 | Datum
30 | 100 | EV1 | Datum
31 | 103 | EV1 | Datum
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: SQL-Abfrage..

Beitrag von PureLust »

Hi ... also um das über eine einzige SELECT-Abfrage zu machen bin ich überfragt.

Wenn Tabelle 1 aber nicht zuuuu viele Einträge enthält, würde ich's 'zu Fuß' machen:

Also alle Einträge aus Tabelle 1 abrufen und dann für jeden Eintrag aus Tabelle 1 einen SELECT in Tabelle 2 für die ID und die beiden Events machen.
Wenn der SELECT für das erste Event Ergebnisse geliefert hat und der SELECT für das zweite Event nicht, dann hast Du einen Treffer.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQL-Abfrage..

Beitrag von Kiffi »

Code: Alles auswählen

Select * From [Tabelle 1], [Tabelle 2]
Where [Tabelle 1].ID = [Tabelle 2].Tab1_ID
And [Tabelle 2].Event_Type = 'EV1'
Grüße ... Peter
Hygge
Derren
Beiträge: 557
Registriert: 23.07.2011 02:08

Re: SQL-Abfrage..

Beitrag von Derren »

Code: Alles auswählen

SELECT Tab1.ID FROM Tab1, Tab2 WHERE Tab2.Tab1_ID = Tab1.ID 
EXCEPT 
SELECT Tab2.Tab1_ID FROM Tab2 WHERE Tab2.Event_Type = 'EV3'
Signatur und so
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: SQL-Abfrage..

Beitrag von techniker »

Derren hat geschrieben:

Code: Alles auswählen

SELECT Tab1.ID FROM Tab1, Tab2 WHERE Tab2.Tab1_ID = Tab1.ID 
EXCEPT 
SELECT Tab2.Tab1_ID FROM Tab2 WHERE Tab2.Event_Type = 'EV3'
EXCEPT gibt es doch (so viel ich weiß) bei MySQL nicht.. :-/
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: SQL-Abfrage..

Beitrag von techniker »

Kiffi hat geschrieben:

Code: Alles auswählen

Select * From [Tabelle 1], [Tabelle 2]
Where [Tabelle 1].ID = [Tabelle 2].Tab1_ID
And [Tabelle 2].Event_Type = 'EV1'
Grüße ... Peter
Das erfüllt leider nicht meine Bedingung, da "..aber noch kein Ereignis "EV3" eingetreten ist."
hiermit nicht erfüllt werden kann.. :cry:
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: SQL-Abfrage..

Beitrag von techniker »

PureLust hat geschrieben:Wenn Tabelle 1 aber nicht zuuuu viele Einträge enthält, würde ich's 'zu Fuß' machen:
Momentan >375'000 mit 48 Spalten - Überwiegend Double.. :roll:
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: SQL-Abfrage..

Beitrag von techniker »

Mir ist vorhin eine Idee gekommen, ob man das nicht mit einer temporären Tabelle lösen könnte.. /:->
Ich teste mal..
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: SQL-Abfrage..

Beitrag von mhs »

Code: Alles auswählen

select * from tab1, tab2 where tab2.tab1_id = tab1.id and tab2.event = ev1 and tab1.id not in (select distinct tab1_id from tab2 where event = ev3)
oder mit right join:

Code: Alles auswählen

select * from tab1 right join tab2 on tab1.id = tab2.tab1_id where tab2.event = ev1 and tab1.id not in (select distinct tab1_id from tab2 where event = ev3)
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Antworten