Avatar billede flash1 Nybegynder
21. januar 2010 - 15:00 Der er 12 kommentarer og
1 løsning

Hjælp til Query

Hej.

Forsøger at lave en query som trækker alle serienumre på HP pc'ere.

Har lavet en query som finder ID på alle hp pc'er og en anden query som lister serienummer.

Men hvordan får jeg samlet dem til et udtryk.


SELECT Inv.Invid
FROM INV WHERE Inv.Section = 'System' AND Inv.Name = 'Manufacturer' AND Inv.Value = 'Hewlett-Packard'


SELECT *
FROM INV
WHERE Inv.Section = 'Bios Information' And Inv.Name = 'Serial Number' OR Inv.Section = 'System' AND Inv.Name = 'Manufacturer'
Avatar billede 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?
Avatar billede flash1 Nybegynder
21. januar 2010 - 15:33 #2
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 :)
Avatar billede 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'
Avatar billede Slettet bruger
21. januar 2010 - 17:05 #4
Skal selvfølgelig være:

WHERE Inv.Section = 'a' or Inv.Section = 'b'
Avatar billede 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'?

Altså en query i en query?

Måske kan du bruge noget herfra http://www.sql-server-performance.com/articles/per/speed_select_tips_p1.aspx
Avatar billede flash1 Nybegynder
21. januar 2010 - 19:04 #6
Er desværre ikke en db som jeg har lavet, men kan kun give dig ret i at den er opbygget noget alternativt..

En query i en query - Jep, det er det som jeg vil.

Har kæmpet noget for at få det til at virke, men kigger på læsestoffet.
Avatar billede janus_007 Nybegynder
21. januar 2010 - 23:25 #7
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'


Jeg går udfra at InvId er en foreign key, ik?
Avatar billede flash1 Nybegynder
22. januar 2010 - 09:30 #8
janus_007: ser rigtig godt ud og det virker.

Men det virker som om den loop'er?

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.
Avatar billede flash1 Nybegynder
22. januar 2010 - 09:37 #9
Hmm, hvis jeg bare spørger på hvor mange er af: Manufaturer - "Hewlett-Packard" får jeg 6848 pc'er.

Med fra dem samlede sql finder den 15553 pc'er før den starter for fra og lister endnu 15553 pc'er med samme serienummer.
Avatar billede flash1 Nybegynder
22. januar 2010 - 09:50 #10
Hvis jeg selecter på alle serienumre får jeg 15552 rows.

Men hvis det ikke lykkes må jeg bare have hp'er pc'er ud og serienumre og så sammenligne dem programmelt.
Avatar billede flash1 Nybegynder
22. januar 2010 - 11:14 #11
Var min egen fejl at det drillede lidt, da jeg manglede en JOIN med pcid. Så det virker.

Lig et svar begge 2, så deler jeg lidt point ud.

Og mange tak for hjælpen.
Avatar billede janus_007 Nybegynder
22. januar 2010 - 12:57 #12
Tiptop

Godt du fik det løst :)
Avatar billede ldanielsen Nybegynder
23. januar 2010 - 01:07 #13
Denne skulle kunne give dig det du ønsker

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'
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester