apua sql

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?
6555
Äänestä

Muut lukivat myös

Vastaukset 6

Vanhimmat

Ihan normaali päivitys lause, ja ehdoksi
taso = 1 AND (arvo = 'k' OR arvo = 'p')

Äänestä
  • 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.

    Äänestä

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ä...

Äänestä
  • 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
    )

    Äänestä

  • ---------- kirjoitti:

    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 :)

    Äänestä

  • ---------- kirjoitti:

    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
    )

    Toimii ! Kiitos.

    Äänestä

Kommentoi aloitusta


pekka kirjoitti:

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?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu