Forum: PC-Programmierung Hallo, brauche Hilfe mit einer ziemlich schwierigen Join abfrage


von Jonas N. (medustv)


Lesenswert?

also erstmal zu meinem Problem: Ich habe eine sehr lange join abfrage 
allerding tut diese nicht das was ich will dazu kommt noch das ich mit 
der Thematik nicht gut auskenne das ziel der abfrage ist es eigentlich 
nicht nur eine zeile anzeigen zu lassen sondern auch die in den tabellen 
enthaltenen daten. Hoffe ich konnte mein Problem genau genug erklären 
wenn nicht fragt ruihg.

Datenbank: 
https://drive.google.com/file/d/1OQXt6-4NsA95UTS0FR5AdA3vxOvRaVnn/view?usp=sharing

Abfrage: SELECT harddisks.modelfamiliy, harddisks.devicemodel, 
harddisks.firmwareversion, harddisks.serialnumber, cases.casename, 
attributenames.attribute_name, attributeflags.flagvalue, 
attributeraw_values.attribute_valuevalue, attributethreshs.threshvalue, 
attributetypes.typevalue, attributeupdates.updatevalue, 
attributevalues.valuevalue, attributewhen_faileds.when_failedvalue, 
attributeworsts.worstvalue, users.PK_user FROM smartcontrol.harddisks 
JOIN smartcontrol.cases ON harddisks.FK_case = cases.PK_case JOIN 
smartcontrol.users ON harddisks.FK_user = users.PK_user JOIN 
smartcontrol.attributeflags ON harddisks.PK_harddisk = 
attributeflags.FK_harddisk JOIN smartcontrol.attributenames ON 
attributeflags.FK_ID_attributename = attributenames.PK_ID_attributename 
JOIN smartcontrol.attributeraw_values ON harddisks.PK_harddisk = 
attributeraw_values.FK_harddisk JOIN smartcontrol.attributethreshs ON 
harddisks.PK_harddisk = attributethreshs.FK_harddisk JOIN 
smartcontrol.attributetypes ON harddisks.PK_harddisk = 
attributetypes.FK_harddisk JOIN smartcontrol.attributeupdates ON 
harddisks.PK_harddisk = attributeupdates.FK_harddisk JOIN 
smartcontrol.attributevalues ON harddisks.PK_harddisk = 
attributevalues.FK_harddisk JOIN smartcontrol.attributewhen_faileds ON 
harddisks.PK_harddisk = attributewhen_faileds.FK_harddisk JOIN 
smartcontrol.attributeworsts ON harddisks.PK_harddisk = 
attributeworsts.FK_harddisk WHERE cases.casename like 'Groß' and 
harddisks.serialnumber like 'WD-WXN1E29E4EL4' and attributeworsts.date = 
'2021-04-30' GROUP BY attributeflags.PK_ID_attributeflag;

von 🐧 DPA 🐧 (Gast)


Lesenswert?

Lass dir die Abfrage zuerst mal in irgend einem Formatier Tool (gibts 
auch online diverse), anständig Formatieren, dann sieht man auch, was 
die eigentlich macht:
1
SELECT harddisks.modelfamiliy,
2
       harddisks.devicemodel,
3
       harddisks.firmwareversion,
4
       harddisks.serialnumber,
5
       cases.casename,
6
       attributenames.attribute_name,
7
       attributeflags.flagvalue,
8
       attributeraw_values.attribute_valuevalue,
9
       attributethreshs.threshvalue,
10
       attributetypes.typevalue,
11
       attributeupdates.updatevalue,
12
       attributevalues.valuevalue,
13
       attributewhen_faileds.when_failedvalue,
14
       attributeworsts.worstvalue,
15
       users.pk_user
16
FROM   smartcontrol.harddisks
17
       JOIN smartcontrol.cases
18
         ON harddisks.fk_case = cases.pk_case
19
       JOIN smartcontrol.users
20
         ON harddisks.fk_user = users.pk_user
21
       JOIN smartcontrol.attributeflags
22
         ON harddisks.pk_harddisk = attributeflags.fk_harddisk
23
       JOIN smartcontrol.attributenames
24
         ON attributeflags.fk_id_attributename = attributenames.pk_id_attributename
25
       JOIN smartcontrol.attributeraw_values
26
         ON harddisks.pk_harddisk = attributeraw_values.fk_harddisk
27
       JOIN smartcontrol.attributethreshs
28
         ON harddisks.pk_harddisk = attributethreshs.fk_harddisk
29
       JOIN smartcontrol.attributetypes
30
         ON harddisks.pk_harddisk = attributetypes.fk_harddisk
31
       JOIN smartcontrol.attributeupdates
32
         ON harddisks.pk_harddisk = attributeupdates.fk_harddisk
33
       JOIN smartcontrol.attributevalues
34
         ON harddisks.pk_harddisk = attributevalues.fk_harddisk
35
       JOIN smartcontrol.attributewhen_faileds
36
         ON harddisks.pk_harddisk = attributewhen_faileds.fk_harddisk
37
       JOIN smartcontrol.attributeworsts
38
         ON harddisks.pk_harddisk = attributeworsts.fk_harddisk
39
WHERE  cases.casename LIKE 'Groß'
40
       AND harddisks.serialnumber LIKE 'WD-WXN1E29E4EL4'
41
       AND attributeworsts.date = '2021-04-30'
42
GROUP  BY attributeflags.pk_id_attributeflag;

Dann, warum ist bei den Einträgen in der Tabelle "harddisks" ein \r (CR, 
carriage return)? Nimm die mal weg, das könnte z.B. in der Konsole zu 
Problemen führen. (Warum matcht das LIKE dort überhaupt etwas, da sind 
ja keine % drin?)

Und dann zu den JOINs, einfach nur JOIN ist ein INNER JOIN. Wenn es dort 
in der zu joinenden Tabelle keine passenden Einträge gibt, bekommst du 
keinen Eintrag. Du brauchst vermutlich LEFT JOINs, wenn dort nichts zu 
joinen ist, gibt es trotzdem einen Eintrag, bei der zu joinenden Tabelle 
ist halt dann alles NULL. Siehe z.B. 
https://www.w3schools.com/sql/sql_join.asp für nette Grafiken und 
Beispiele.

von Jonas N. (medustv)


Lesenswert?

Danke für deine Hilfe

von Udo S. (urschmitt)


Lesenswert?

Wenn du dich nicht gut auskennst, dann musst du entweder einfache 
Abfragen machen oder lernen.
Geh halt schrittweise vor. Mach eine Abfrage auf eine Tabelle. Wenn die 
funktioniert nehme das Join auf eine weitere Tabelle dazu und schau was 
rauskommt.
Wenn du so schrittweise vorgehst dann siehst du genau wo es hängt.

Vorher solltest du aber erst mal wissen welches Ergebnis du haben 
willst. Da du hier einfach dieses "Monster" Join reinwirfst ohne auch 
nur zu beschreiben welches Ergebnis du haben möchtest deutet darauf hin, 
dass das SQL eher irgendwo mit copy & paste geholt wurde.
Vieleicht passt deine Datenbank gar nicht dazu.

: Bearbeitet durch User
von Jonas N. (medustv)


Lesenswert?

Udo hättest du eventuell Lust mir gegen eine Bezahlung zu helfen? und 
das Problem zu lösen?

von Udo S. (urschmitt)


Lesenswert?

Jonas N. schrieb:
> Udo hättest du eventuell Lust mir gegen eine Bezahlung zu helfen? und
> das Problem zu lösen?

Danke, aber nein. Keine Zeit und auch nicht wirklich Lust dazu. Aber du 
kannst das Angebot mit einer möglichst vollständigen Beschreibung was zu 
tun wäre ja mal in das Unterforum "Markt" stellen.
Aber dann musst du schon deutlich mehr Infos liefern wie in dem Post 
hier.

von Jonas B. (jibi)


Lesenswert?

Ha, die Abfrage ist doch recht easy...

>das ziel der abfrage ist es eigentlich
>nicht nur eine zeile anzeigen zu lassen sondern auch die in den tabellen
>enthaltenen daten

dann mach halt die WHERE-Bedingung raus.

von Experte (Gast)


Lesenswert?


von Jonas (Gast)


Lesenswert?

Was ist damit?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.