Hallo, brauche Hilfe mit einer ziemlich schwierigen Join abfrage

OP #6685846
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;
Gast #6685981
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.
#6686012
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.
#6686210
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren