Toon posts:

[PostgreSQL] Probleem met subquery na Postgres upgrade

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb gisteren mijn PostgreSQL server geupgrade van v7.2.4 naar v7.4.1.
De gehele website die gebruik maakt van de data in de PostgreSQL database werkt nog prima. Er is echter wel een probleempje met een update script waarin een paar (sub)queries worden uitgevoerd.

Het script haalt gegevens uit een tabel 'wedstrijden', voert vervolgens een paar berekeningen uit en plaatst de uitkomsten van de berekeningen in de tabel 'standen'.

Hieronder een gedeelte uit de query die goed werkt in v7.2.4, maar nu niet meer in v7.4.1.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT team_naam, team_id, wpim, (
       SELECT count(thuis_uitslag)
              FROM wedstrijden
              WHERE (thuis_wed = t.team_id OR uit_wed = t.team_id)
              AND seizoen_id = 3 AND klasse_id = 1)
              AS wd, (
       SELECT count(t.team_id)
              FROM wedstrijden w
              WHERE (thuis_wed = t.team_id AND thuis_uitslag > uit_uitslag OR uit_wed = t.team_id AND thuis_uitslag < uit_uitslag)
              AND seizoen_id = 3 AND klasse_id = 1 )
              AS gw
FROM teams t
WHERE seizoen_id = 3 AND klasse_id = 1
GROUP BY t.team_naam, t.team_id, t.team_id, t.wpim";


De database server geeft na het uitvoeren van de query deze melding terug:
code:
1
2
SQL error:
ERROR:  more than one row returned by a subquery used as an expression

Het probleem heeft dus iets te maken met de subquery die ik gebruik.
Weet iemand wat ik fout doe:?
Ik kan me bijna niet voorstellen dat Postgres niet meer overweg kan met deze subqueries, die in 7.2 nog wel goed was.

[ Voor 8% gewijzigd door Verwijderd op 26-02-2004 01:51 ]


Verwijderd

Wat krijg je terug als je enkel de subqueries apart uit voert?

Verwijderd

Ik zou bij de 2de subquerie al eens een extra set haakjes doen om de AND's te groeperen, want volgens mij gaat het daar mis en krijg je nu meer dan 1 row terug = de error die je krijgt.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Als dit geen vereenvoudigde weergave van je query is, dan zou ik es op de postgresql-mailinglist vragen of je met een bug te maken hebt. Een count(..) geeft tenslotte per definitie maar 1 row terug...

Maar wat ik me dus afvraag is of dit wel je complete query is?

[ Voor 15% gewijzigd door ACM op 26-02-2004 10:29 ]


Verwijderd

Topicstarter
Verwijderd schreef op 26 februari 2004 @ 09:12:
Wat krijg je terug als je enkel de subqueries apart uit voert?
PHP:
1
2
3
4
SELECT count(thuis_uitslag)
       FROM wedstrijden
       WHERE (thuis_wed = teams.team_id OR uit_wed = teams.team_id)
       AND seizoen_id = 3 AND klasse_id = 1

Dat geeft een waarde 10691 terug. Dus de uitkomst van de count.

PHP:
1
2
3
4
SELECT count(teams.team_id)
   FROM wedstrijden w
   WHERE (thuis_wed = teams.team_id AND thuis_uitslag > uit_uitslag OR uit_wed = teams.team_id AND thuis_uitslag < uit_uitslag)
   AND (seizoen_id = 3 AND klasse_id = 1)

Deze query geeft 4520 terug.

Verwijderd

Topicstarter
Verwijderd schreef op 26 februari 2004 @ 09:20:
Ik zou bij de 2de subquerie al eens een extra set haakjes doen om de AND's te groeperen, want volgens mij gaat het daar mis en krijg je nu meer dan 1 row terug = de error die je krijgt.
Ik heb er een paar extra haakjes bij gezet, waardoor de query er nu zo uit ziet.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT team_naam, team_id, wpim, (
       SELECT count(thuis_uitslag)
                FROM wedstrijden
                WHERE (thuis_wed = t.team_id OR uit_wed = t.team_id)
                AND (seizoen_id = 3 AND klasse_id = 1))
                AS wd, (
       SELECT count(t.team_id)
                FROM wedstrijden w
                WHERE ((thuis_wed = t.team_id AND thuis_uitslag > uit_uitslag OR uit_wed = t.team_id AND thuis_uitslag < uit_uitslag)
                AND (seizoen_id = 3 AND klasse_id = 1)))
                AS gw
FROM teams t
WHERE seizoen_id = 3 AND klasse_id = 1
GROUP BY t.team_naam, t.team_id, t.team_id, t.wpim


Het resultaat blijft hetzelfde.
Ik ga zoals ACM voorstelde maar eens op de Postgres mailling-list een bericht plaatsen.

[ Voor 82% gewijzigd door Verwijderd op 26-02-2004 10:45 ]


Verwijderd

Topicstarter
ACM schreef op 26 februari 2004 @ 10:28:
Maar wat ik me dus afvraag is of dit wel je complete query is?
De query die ik had gepost is inderdaad niet compleet. Het structuur van de query is voor de rest hetzelfde, vandaar dat ik dat eruit heb gelaten.

Dit is de volledige query:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
SELECT team_naam,team_id,wpim,(
     SELECT count(thuis_uitslag)
    FROM wedstrijden
        WHERE (thuis_wed = t.team_id OR uit_wed = t.team_id)
        AND seizoen_id = 3 AND klasse_id = 1)
        AS wd, (
     SELECT count(t.team_id)
        FROM wedstrijden w
        WHERE (thuis_wed = t.team_id AND thuis_uitslag > uit_uitslag OR uit_wed = t.team_id AND thuis_uitslag < uit_uitslag)
        AND seizoen_id = 3 AND klasse_id = 1)
        AS gw, (
     SELECT count(t.team_id)
        FROM wedstrijden w
        WHERE (thuis_wed = t.team_id AND thuis_uitslag = uit_uitslag OR uit_wed = t.team_id AND thuis_uitslag = uit_uitslag)
        AND seizoen_id = 3 AND klasse_id = 1)
        AS gl, (
     SELECT count(t.team_id)
        FROM wedstrijden w
        WHERE (thuis_wed = t.team_id AND thuis_uitslag < uit_uitslag OR uit_wed = t.team_id AND thuis_uitslag > uit_uitslag)
        AND seizoen_id = 3 AND klasse_id = 1)
        AS vl, ((
     SELECT count(t.team_id)
        FROM wedstrijden w
        WHERE (thuis_wed = t.team_id AND thuis_uitslag > uit_uitslag OR uit_wed = t.team_id AND thuis_uitslag < uit_uitslag) AND seizoen_id = 3 AND klasse_id = 1  )*3)+((
     SELECT count(t.team_id)
        FROM wedstrijden w
        WHERE (thuis_wed = t.team_id AND thuis_uitslag = uit_uitslag OR uit_wed = t.team_id AND thuis_uitslag = uit_uitslag) AND seizoen_id = 3 AND klasse_id = 1 )*1)-t.wpim::int
        AS pnt, (
     SELECT sum(thuis_uitslag)
        FROM wedstrijden
        WHERE (thuis_wed = t.team_id) AND seizoen_id = 3 AND klasse_id = 1 )
        AS dlpvt, (
     SELECT sum(uit_uitslag)
        FROM wedstrijden
        WHERE (uit_wed = t.team_id) AND seizoen_id = 3 AND klasse_id = 1 )
        AS dlpvu, (
     SELECT sum(thuis_uitslag)
        FROM wedstrijden
        WHERE (uit_wed = t.team_id) AND seizoen_id = 3 AND klasse_id = 1 )
        AS dlptt, (
     SELECT sum(uit_uitslag)
        FROM wedstrijden
        WHERE (thuis_wed = t.team_id) AND seizoen_id = 3 AND klasse_id = 1 )
        AS dlptu
FROM teams t
WHERE seizoen_id = 3 AND klasse_id = 1
GROUP BY t.team_naam, t.team_id, t.team_id, t.wpim


Ja ik weet dat het belachelijk groot is :), maar het doet (deed) wat ik wil. :)

Verwijderd

Topicstarter
Het probleem is opgelost na een tip van een Postgres developer :)
Ik heb van count(thuis_uitslag), count(uit_uitslag) enz.., count(*) gemaakt.
Pagina: 1