# Eine Tabelle updaten



## Kirby.exe (24. Mai 2021)

Also ich möchte gerne alle Zeilen der Tabelle "zahlen" updaten wenn der Wert zahl ebenfalls in dem CTE "gezogen" vorkommt. Leider sagt er, dass irgendwas mit dem Query falsch ist und ich verstehe nicht was xD



```
hochzaehlen AS (
    UPDATE zahlen SET anzahlGezogen = anzahlGezogen + 1 WHERE zahl IN gezogen
    RETURNING *
)
```

Das ist die Fehlermeldung von psql:


```
ERROR:  syntax error at or near "gezogen"
LINE 5: ... SET anzahlGezogen = anzahlGezogen + 1 WHERE zahl IN gezogen
                                                                ^
```


----------



## Kirby.exe (24. Mai 2021)

Ich packe einfach mal das ganze Query hier hin:


```
WITH gezogen AS (
    SELECT floor(random() * max(zahlen.zahl) + min(zahlen.zahl))::NUMERIC
    FROM zahlen
),
hochzaehlen AS (
    UPDATE zahlen
    SET anzahlGezogen = anzahlgezogen+1
    WHERE zahl IN gezogen
    RETURNING *
),
richtige AS (
    SELECT *
    FROM spiel
    INTERSECT
    SELECT *
    FROM gezogen
)
SELECT (
        CASE
            WHEN count(*) <= 2 THEN 'Kein Gewinn'
            ELSE concat('Ein ', count(*), 'er')
        END
    )
FROM richtige;
```


----------



## Kirby.exe (24. Mai 2021)

Also ich verstehe jetzt warum, das Query in dem CTE "richtige" nicht funktioniert...Aber ich habe keine Ahnung wie ich es hinbekomme, dass es funktioniert


----------



## mihe7 (24. Mai 2021)

Muss das UPDATE nicht so aussehen?

```
UPDATE zahlen SET anzahlGezogen = anzahlGezogen + 1 WHERE zahl = (SELECT * FROM gezogen)
```

Was soll das eigentlich werden, wenn es fertig ist?


----------



## Kirby.exe (24. Mai 2021)

Ein Lotto spiel xD Ist ne Aufgabe der Uni xD und die sollen wir mit PSQL machen xD


----------



## Kirby.exe (24. Mai 2021)

Mir fällt gerade auf, dass ich immer nur eine Zahl "ziehe"...Ich brauche aber 6 xD

Die Frage ist jetzt, wie kann ich das Zeug in dem Select x mal wiederholen xD


----------



## mihe7 (24. Mai 2021)

Kirby.exe hat gesagt.:


> Ein Lotto spiel xD Ist ne Aufgabe der Uni xD und die sollen wir mit PSQL machen xD


Das hatte ich mir schon gedacht, aber was genau soll da passieren?


----------



## Kirby.exe (24. Mai 2021)

Naja am Anfang wird eine Tabelle zahlen erstellt und mit den Zahlen 1-49 gefüllt. Dann werden 6 Zahlen "gezogen" und in eine Tabelle spiel gepackt.

Nun soll in einer Schleife (welche 104 Interationen macht) Lottoziehungen statt finden und es soll geschaut werden ob man gewonnen hat xD

Das ganze sieht im Moment so aus:


```
#!/bin/bash

PSQL="psql -U postgres -h localhost -p 5435"

#Alle im Script verwendeten Tabellen löschen
$PSQL -q -c "DROP TABLE IF EXISTS zahlen;DROP TABLE IF EXISTS spiel;"
$PSQL -q -c "CREATE TABLE zahlen (zahl NUMERIC, anzahlGezogen NUMERIC DEFAULT 0);"
$PSQL -q -c "INSERT INTO zahlen(zahl) SELECT * FROM generate_series(1, 49);"

#Spiel Tabelle erstellen und füllen
$PSQL -q -c "CREATE TABLE spiel (zahl NUMERIC);"

counter=1
while [ $counter -le 6 ]
do
    $PSQL -q -c "INSERT INTO spiel SELECT floor(random() * max(zahlen.zahl) + min(zahlen.zahl))::NUMERIC FROM zahlen; --RETURNING zahl;"
    ((counter++))
done

$PSQL -t -q -c "SELECT * FROM spiel;"

counter=1
while [ $counter -le 104 ]
do
    $PSQL -t -q -c "WITH gezogen AS (
                SELECT floor(random() * max(zahlen.zahl) + min(zahlen.zahl))::NUMERIC as num FROM zahlen
            ),
            hochzaehlen AS (
                UPDATE zahlen SET anzahlGezogen = (anzahlGezogen + 1) WHERE zahl = (SELECT * FROM gezogen)
                RETURNING *
            ),
            richtige AS (
                SELECT * FROM spiel
                INTERSECT
                SELECT * FROM gezogen
            )
            SELECT (CASE WHEN count(*) <= 2 THEN 'Kein Gewinn' ELSE concat('Ein ', count(*), 'er') END) FROM richtige;"
    ((counter++))
done
```


----------



## mihe7 (24. Mai 2021)

Dafür muss ich aber doch nicht wissen, wie oft eine Zahl gezogen wurde, oder?


----------



## Kirby.exe (24. Mai 2021)

mihe7 hat gesagt.:


> Dafür muss ich aber doch nicht wissen, wie oft eine Zahl gezogen wurde, oder?


Was meinst du? Ich zähle doch nur wie viele übereinstimmungen es gibt oder etwa nicht?


----------



## mihe7 (24. Mai 2021)

Ich meine anzahlGezogen - das wird außer im UPDATE ja nirgends sonst verwendet...


----------



## Kirby.exe (24. Mai 2021)

mihe7 hat gesagt.:


> Ich meine anzahlGezogen - das wird außer im UPDATE ja nirgends sonst verwendet...


Das kommt noch xD Das kommt ganz am Ende, aber soweit bin ich noch nicht xD


----------



## mihe7 (24. Mai 2021)

Geht es vielleicht darum, dass eine Zahl nicht doppelt gezogen wird?


----------



## Kirby.exe (24. Mai 2021)

mihe7 hat gesagt.:


> Geht es vielleicht darum, dass eine Zahl nicht doppelt gezogen wird?


Ehm gute Frage xD Kann ich gleich schauen xD Aber hast du ne Idee wie ich das was in dem CTE „gezogen“ 6 mal in dem CTE habe? xD


----------



## mihe7 (24. Mai 2021)

```
SELECT * FROM generate_series(1,49) ORDER BY random() LIMIT 6;
```


----------



## Kirby.exe (24. Mai 2021)

Lel daran hatte ich gar nicht gedacht xD


----------



## Kirby.exe (24. Mai 2021)

Jetzt funktioniert alles  Nur eine Sache nervt mich ultra xD Und zwar immer der Zeilenumbruch zwischen den Ausgaben xD


```
32
   38
    2
   32
   17
   25

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn

 Kein Gewinn
```


----------

