webForumDet fria alternativet

Uppdatera värden i sp

Databaser & SQL

4 svar · 163 visningar · startad av Dino

Medlem sedan sep. 20011 914 inlägg
Frågan#1

Har två SELECT
Select 1

DECLARE @g int
SET @g = (SELECT ec_totalg FROM t_ec WHERE ec_t_id = 1)

retunerar ex 16

Select 2

SELECT tri_g FROM t_gt WHERE t_gt.tri_t_id = 1

retunerar ex
tri_g
------
2
7
0
10
3
0
5

Vad jag nu vill göra är att gå igenom värderna i tri_g för att se om de är mindre än summan från select 1 om inte då skall värdet sättas till 0.
Ex.
2 är mindre än 16
2+7 är mindre än 16
2+7+0 är mindre än 16
2+7+0+10 är större än 16 (gå in i tri_g och sätt 10 till 0)
2+7+0+(0)+3 är mindre än 16
2+7+0+(0)+3+0 är mindre än 16
2+7+0+(0)+3+5 är större än 16 (gå in i tri_g och sätt 5 till 0)

Medlem sedan dec. 200012 464 inlägg
#2

Jag tycker att hela upplägget verkar skumt. Eftersom du inte har någon order by så vet du aldrig i vilken ordning posterna kommer och då lägger du in ett beroende att posterna uppdateras, inte enbart beroeende på vilka värden de har, utan på vilken innebördes ordning de returneras i.

Vad är det du vill göra?

Medlem sedan sep. 20011 914 inlägg
#3

tabellen t_gt ser ut typ så här.

t_id |tri_t_id | tri_g
1	 1	  2
2	 1	  0
3	 1	  0
4	 1	  10
5	 1	  0
6	 1	  0
7	 1	  2
8	 2	  10
9	 2	  5
10	 2	  0
11	 2	  5
12	 2	  2
13	 2	  0
14	 2	  10
...

så jag antar att jag kan sätta order by

SELECT tri_g FROM t_gt WHERE t_gt.tri_t_id = 1 ORDER BY t_id ASC

Det jag hade tänkt göra är att innan jag kör själva huvud SELECTen som skall ta ut datan från t_gt till sidan. Så skall jag först kolla och uppdatera värderna i tri_g om de är större än värdet från select1 i mitt första inlägg, se ex även det i första inlägget. För värderna i respektive tabell kan uppdateras oberoende av varandra och därför vill jag köra denna kontrollen innan. Lite tydligare hoppas jag. ;)

Medlem sedan dec. 200012 464 inlägg
#4
while (( select sum(tri_g) from t_gt where tri_g > 0 ) > 16)
   update t_gt 
       set tri_g = 0
      where id = (select min(id) from t_gt
                where tri_g = (select max(tri_g) from t_gt
        where tri_t_id = 1)
           and tri_t_id = 1)

Det går att använda en cursor också. Du bör ha ett index på tri_g (beror iofs på hur mycket data du har.

red: slarv med parenteser

Medlem sedan sep. 20011 914 inlägg
#5

Modifierade den lite, och den funkar perfekt. Tack så mycket. :)

266 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)