Med observability og tæt samarbejde sikrer Fibia og Novataris stabilitet og fejlfrie systemer døgnet rundt
9. december 2024
Slettet bruger
21. januar 2010 - 15:18#1
Nu har du jo nogle lidt selvmodsigende selects vil jeg mene, i det du vil have inv.Section til at være henholdsvis 'System' or 'Bios Information' og de trækes fra den samme tabel. Det samme gøres gældende for Inv.Name, der sættes til to forskellige værdier.
Det vil i mine øjne skabe problemer, men måske kan du opsplitte tabellen i to tabeller og så hente ud vha. Joins?
Problemet er at alle data om en pc ligger i den samme tabel.
Så i den ene række står oplysninger om det er en HP pc og i en anden række står serienummeret.
Kan bare ikke gennemskue, hvordan jeg gør det i en select.
Håber at det bare var en lille smule forståeligt :)
Synes godt om
Slettet bruger
21. januar 2010 - 17:03#3
Det er også ok, bortset fra at data som fx. Manufakturer måske burde i en tabel for sig selv. Jeg går ud fra at flere pc'ere kan have samme Manufakturer og for ikke at skabe redundans vil man typisk lave en Manufakturer tabel, hvor man så giver de enkelte forhandlere/ producenter et unikt id, fx. et nummer, som der så kan refereres til i evt. selects, hvor man så kan joine resultatet fra flere tabeller i en query.
Hvad sker der fx. hvis DELL skifter navn til DELL2? Så skal du jo ind og rette i alle posterne for pc'ere, der stammer fra DELL og det kan skabe problemer - for det første fordi du måske skal rette i 10.000 poster, men også fordi at du måske så retter forkert i nogle poster. Det kan selvfølgelig scriptes så alle poster rettes af én gang, men det er ikke god stil.
Jeg kan som sagt ikke helt gennemskue dine queries i dit første indlæg. Der er ikke noget i vejen med det du gør, men jeg kan bare ikke se hvordan du vil lave en query, der samlet udgøres af disse to quwries, de er jo modstridende et eller andet sted. Men måske har jeg bare misforstået dig.
Du kan jo ikke både skrive WHERE Inv.Section = "a" og så skrive WHERE Inv.Section = "b" i samme udtryk. Så skal du måske ud i noget WHERE Inv.Section = 'a' or WHERE Inv.Section = 'b'
Synes godt om
Slettet bruger
21. januar 2010 - 17:05#4
Skal selvfølgelig være:
WHERE Inv.Section = 'a' or Inv.Section = 'b'
Synes godt om
Slettet bruger
21. januar 2010 - 17:09#5
Og ved nærmere eftertanke kan jeg måske alligevel se hvad det er du prøver.
Skal det forstås sådan, at du først kører den første query for at finde alle poster indeholdende Hewlet Packard og derefter laver en forespørgsel, hvor alle de poster der først er fundet indeholder Inv.Section ='Bios Information'?
SELECT t.Invid, p.* FROM INV t cross apply( SELECT * FROM INV WHERE Section = 'Bios Information' And Name = 'Serial Number' OR Section = 'System' AND Name = 'Manufacturer' and InvId = t.Invid ) as p WHERE t.Section = 'System' AND t.Name = 'Manufacturer' AND t.Value = 'Hewlett-Packard'
Query'en står bare og bliver ved med at hente data og da jeg stoppede den var der 10mil rows.
De første ca. 15.000 er dem som jeg skal bruge, men herefter ser det ud til at den starter forfra og lister de 15.000 igen, igen og igen uden at stoppe.
SELECT * FROM INV Inv1 INNER JOIN INV Inv2 ON Inv1.Invid WHERE Inv1.Section = 'System' AND Inv1.Name = 'Manufacturer' AND Inv1.Value = 'Hewlett-Packard' AND Inv2.Section = 'Bios Information' AND Inv2.Name = 'Serial Number'
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.