webForumDet fria alternativet

Tankenöt: Söka med toleransvärden från samma tabell

Databaser & SQL

8 svar · 475 visningar · startad av lilja

Medlem sedan juli 20041 183 inlägg
Frågan#1

Jag har en databas med ArtikelId, FältId, Värde och ToleransFältId:

ArtikelId | FältId | Värde | ToleransFältId
A1 ------ F1 ----- 3900 -- F2
A1 ------ F2 ----- 200
A1 ------ F3 ----- 350
A2 ------ F1 ----- 3900 -- F2
A2 ------ F2 ----- 400
A2 ------ F3 ----- 450

Jag vill plocka ut alla artiklar som har ett specifikt fältvärde inom ett visst intervall för en av dess fält.

Säg att jag söker på 3800 på fält F1. Då vill jag att båda artiklarna skall visas då 3700 är inom intervallet 3900+/-200 samt 3900+/-400.

Men om jag söker på 3600 på fält F1. Då vill jag att enbart artikel A2 skall visas då den är inom intervallet. Alltså A1 har intervallet 3700-4100 och är inte inom intervallet.

Med följande SQL har jag lyckats plocka ut just den raden som stämmer när det är tolerans men jag vill ha ut alla fält för den artikeln där de fält man söker på stämmer med sökkriterierna.

select * from tbl_testar T1
join tbl_testar T2 on T1.ToleransFältId= T2.FältId and T1.ArtikelId = T2.ArtikelId 
where (3700 between (T1.Värde - T2.Värde ) and (T1.Värde + T2.Värde)) ;

Går detta att göra i SQL?

Medlem sedan apr. 2006409 inlägg
#2

OT: Gör du det inte lite väl svårt för dig när du blandar ihop olika saker som du gör? Ska verkligen följande rader vara i samma tabell?

A1 ------ F1 ----- 3900 -- F2
A1 ------ F2 ----- 200

Finns det en egen artikel/vara för varje toleransnivå? Annars borde du kanske se till att göra en många till en relation mellan toleranserna till artikel/vara. Eller. vad vill du göra egentligen..?

Medlem sedan juli 20041 183 inlägg
#3

Grejen är den att det behöver inte finnas ett toleransfält för en artikel och man ska kunna koppla på andra saker som gör att ett fält är "beroende" av ett annat. Toleransfältet är i sig annars en del av artikeln.

Medlem sedan apr. 2006409 inlägg
#4

Men... varför kopplar du inte saker via ArtikelID i så fall..?

Medlem sedan juli 20041 183 inlägg
#5

überfuzz skrev:

Men... varför kopplar du inte saker via ArtikelID i så fall..?

Ok men om jag gör de så har jag fortfarande samma problem. Jag får bara ut exakt den raden som stämmer. Jag vill ha ut alla fält för de artiklar vars fält stämmer när man söker på dem.

Alltså man kan söka på 3 fält men vill ändå ha ut alla fält för de artiklar som faller inom urvalet?

Medlem sedan apr. 2006409 inlägg
#6

Jaja, du frågade ju inte om lämplig tabellstruktur.

Jag utgår ifrån att T1.värde är normalen i sökningen och att T2.värde är variansen. Vad ger WHERE T1.Värde BETWEEN (T1.Värde - T2.värde) AND (T1.Värde + T2.värde)

Medlem sedan juli 20041 183 inlägg
#7

überfuzz skrev:

Vad ger WHERE T1.Värde BETWEEN (T1.Värde - T2.värde) AND (T1.Värde + T2.värde)

Det är exakt det jag gjort i SQL-exemplet jag postade i första inlägget?

Medlem sedan apr. 2006409 inlägg
#8

lilja skrev:

Det är exakt det jag gjort i SQL-exemplet jag postade i första inlägget?

Mja, då har du skrivit fel. 3700 etc...
I alla fall, det är din tabellstruktur som ställer till det för dig om du inte får ut alla rader med T1 +- T2. Får du inte ändra på tabellerna..?

Medlem sedan juli 20041 183 inlägg
#9

überfuzz skrev:

Mja, då har du skrivit fel. 3700 etc...
I alla fall, det är din tabellstruktur som ställer till det för dig om du inte får ut alla rader med T1 +- T2. Får du inte ändra på tabellerna..?

Alltså när jag kör min SQL-sats får jag bara ut första raden (i mitt exempel) när jag vill ha ut de tre översta. Själva SQL-satsen måste byggas om men jag förstår inte hur.

Jag kanske måste ställa två frågor. Ett där jag får ut alla artiklar som finns inom variansen samt vanliga SQL-kriterier på fält som inte har varians och sen en till fråga för att hämta alla afält för alla artiklar som stämmer. Är du med?

Jag kan inte bygga om databasen då den inte blir tillräckligt dynamisk då. Svårt att förklara men så är det.

278 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
146 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
132 ms — ändringar (db)