Seite 1 von 2

SQL-Abfrage..

Verfasst: 19.02.2016 19:53
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!

Re: SQL-Abfrage..

Verfasst: 19.02.2016 20:00
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

Re: SQL-Abfrage..

Verfasst: 19.02.2016 20:54
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.

Re: SQL-Abfrage..

Verfasst: 19.02.2016 21:01
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

Re: SQL-Abfrage..

Verfasst: 19.02.2016 21:09
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'

Re: SQL-Abfrage..

Verfasst: 20.02.2016 01:26
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.. :-/

Re: SQL-Abfrage..

Verfasst: 20.02.2016 01:27
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:

Re: SQL-Abfrage..

Verfasst: 20.02.2016 01:29
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:

Re: SQL-Abfrage..

Verfasst: 20.02.2016 01:30
von techniker
Mir ist vorhin eine Idee gekommen, ob man das nicht mit einer temporären Tabelle lösen könnte.. /:->
Ich teste mal..

Re: SQL-Abfrage..

Verfasst: 20.02.2016 07:07
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)