Ongelma
taulu jossa on esim:
koodi arvo taso
123 k1
124 p1
125 k1
125 p1
126 k1
126 p1
127 p1
128 k1
129 k1
129 p1
Pitäisi päivittää taulua siten että *taso' kenttään tulisi 'X' niille vain 'koodeille'
joilla on molemmat 'arvot' k1 ja p1. Tässä
esim tulisi antaa 'X' koodeille: 126,126 ja 129
millainen SQL-lause hoitaisi asian?
taulu jossa on esim:
koodi arvo taso
123 k1
124 p1
125 k1
125 p1
126 k1
126 p1
127 p1
128 k1
129 k1
129 p1
Pitäisi päivittää taulua siten että *taso' kenttään tulisi 'X' niille vain 'koodeille'
joilla on molemmat 'arvot' k1 ja p1. Tässä
esim tulisi antaa 'X' koodeille: 126,126 ja 129
millainen SQL-lause hoitaisi asian?
Vastaukset 6
Vanhimmat
Ihan normaali päivitys lause, ja ehdoksi
taso = 1 AND (arvo = 'k' OR arvo = 'p')
Sorry,
En ihan ymmärtänyt ohjettasi, mutta otetaan vielä uusi esim:
Taulu:
Koodi Varasto Merkki
0001 KV
0001 PI
0002 KV
0003 KV
0004 KV
0004 PI
0005 PI
0006 KV
0007 KV
0007 PI
0008 KV
0009 PI
0009 KV
Tässä tulisi lisätä "Merkki" -kenttään arvo 'X'koodeille; 0001,0004,0007,0009.
Eli kaikille koodeille, joilla on 'Varasto'
KV ja PI.
Minulla on taulu jossa yli 4500 riviä , jotka pitäisi päivittää vastaavasti.
Tosiaan tuo edellinen vastaus oli ihan metsässä, ei valitettavasti onnistu ihan noin helposti. Tästä ei taida selvitä ilman sisäkkäisiä lauseita (valitettavasti menee aika raskaaksi operaatioksi). Jos joku keksii kevyemmän tavan, niin ilmoitelkoon, itse en ainakaan näin pikaisesti katsoen keksinyt. Eli itse lauseke:
UPDATE taulu SET taso='X' WHERE koodi IN (SELECT koodi FROM taulu WHERE koodi IN (SELECT koodi FROM taulu WHERE arvo='k1') AND arvo='p1');
Pitäisi toimia, vaikkakin useat sisäkkäiset lausekkeet eivät ole yleensä hirveän suositeltavia (suorituskyvyn kannalta, etenkin jos on kyseessä tosi iso kanta), mutta tässä kai niiden käytöltä ei oikein voi välttyä...
Kyllä minun vastaukseni toimii niinkuin pitää, mutta vastaaja vain ymmärsi hieman väärin kysymyksen ja mitä tietoa sarakkeissa on ;)
Ei tuohon tarvita noin monimutkasta kyselyä, käytetään vain HAVING ehtoa, seuraava ratkaisu on MySQL:ssä toimiva (alikyselyjä tukevissa versioissa), mihkä tietokantaan edes haluat ratkaisun?
UPDATE taulu SET taso='X' WHERE koodi IN (
SELECT koodi FROM taulu WHERE arvo IN ('k1','p1') GROUP BY koodi HAVING COUNT(*) = 2
)
Niin ensimmäinen vastauksesi tosiaan oli ihan oikein, mutta ei tähän alkuperäisen kysyjän kysymykseen :)
Hyvä, että löytyi yksinkertaisempikin lauseke asian ratkaisuksi. Itsellä ei ole tullut aikoihin tietokantojen kanssa puljattua, joten ei välttämättä heti kaikkein parhaat ratkaisut tule mieleen :)
Toimii ! Kiitos.