Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[mysql] Incorrect usage of UNION and INTO

Pagina: 1
Acties:
  • 247 views sinds 30-01-2008
  • Reageer

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Ik krijg een raar probleem in MySQL bij het gebruik van een union tussen twee derived tables die ik met een aggregate in een variabele stop.

De query is onderdeel van een stored procedure en ziet er als volgt uit:

SQL:
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
    SELECT
        SUM(`amount`)
    INTO
        wage_expense
    FROM
    (
        (
            SELECT
                `amount`        AS  `amount`
            FROM
                `mExpense`
            WHERE
                `fk_pid`        =   personid    AND
                `date`          =   work_date   AND
                `unit`          =   'money'     AND
                `status`        >   0
        )
        UNION
        (
            SELECT
                `mExpense`.`amount`     *
                `wages`.`wage`          AS  `amount`
            FROM
                `mExpense`
            JOIN
            (
                `wages`,
                `person`
            )
            ON
                `wages`.`age`           =   years(`person`.`birthdate`, work_date)
            WHERE
                `mExpense`.`fk_pid`     =   personid    AND
                `mExpense`.`date`       =   work_date   AND
                `mExpense`.`unit`       =   'hours'     AND
                `wages`.`group_id`      =   1
        )
    )                  AS  expenses;


Ik krijg daarbij een foutmelding: "ERROR 1221 (HY000): Incorrect usage of UNION and INTO" . Dit zou toch gewoon moeten werken? Door de SUM() is het nooit meer dan 1 rij en zou het dus goed moeten gaan.

Het gaat trouwens om MySQL versie 5.0.42-log

Ik ontken het bestaan van IE.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

En dit is binnen een stored routine? Beter lezen.

Ik zie er inderdaad ook niet aan wat er niet zou mogen, het lijkt me gewoon een geldige expressie, maar zo goed ken ik mysql's nukken niet mbt stored routine-sql.

Je kan natuurlijk nog je complete union+aggregate in een subselect verpakken en daar weer je select into omheen vouwen ala:

select val into var
FROM (select sum(...) as val FROM (select ... union select ...) as s ) as s2

[ Voor 84% gewijzigd door ACM op 30-07-2007 14:22 ]


  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
ACM schreef op maandag 30 juli 2007 @ 14:18:
En dit is binnen een stored routine?
Klopt. Onderdeel van een stored procedure.

Ik ontken het bestaan van IE.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Een ander alternatief in dit geval is zoiets:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
    SELECT
            (SELECT
                SUM(`amount`) AS  `amount`
            FROM  `mExpense`
            WHERE `fk_pid` =   personid -- AND ...)
            +
            (SELECT
                SUM(`mExpense`.`amount` * `wages`.`wage`) AS  `amount`
            FROM `mExpense` -- JOIN ...
            WHERE -- ...)
     INTO
       wage_expense

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24

BikkelZ

CMD+Z

Als hij zo expliciet aangeeft een probleem tussen UNION en INTO te hebben, is het niet het slimste om die SUM te doen op een SELECT waarin die UNION zit, en die variabele INTO te gebruiken.

Dus:

SQL:
1
2
3
4
5
6
SELECT totalwage
INTO wage_expense
FROM
( SELECT SUM(amount) totalwage
FROM ( /* unions hier */ )
)

iOS developer


  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Het alternatief van ACM werkt gelukkig, maar ik zou toch graag nog willen weten waarom dit niet werkt.

Ik ontken het bestaan van IE.

Pagina: 1