Newsgroup: it.comp.software.database
Titolo: mysql: select annidata, bug?

Salve a tutti, ho un problema abbastanza strano: una select annidata mi 
ritorna un dato diverso rispetto alla stessa select eseguita da sola.
Mi potete dire se anche a voi fornisce lo stesso risultato? Secondo voi 
sbaglio qualcosa?
Sarei molto curioso di sapere se anche postgres rende la stessa cosa
Ecco i dettagli:
#SELECT SEMPLICE
#QUESTA RENDE 403.9
SELECT listini.prezzo AS prezzo
FROM listini
WHERE listini.codicelistino = 'USD' AND listini.codicearticolo = '2EQE02120'
#SELECT ANNIDATA
#QUESTA RENDE 403.89999389648
SELECT (SELECT listini2.prezzo AS prezzo
FROM listini2
WHERE listini2.codicelistino = 'USD' AND listini2.codicearticolo = 
'2EQE02120')
FROM listini2
where listini2.codicearticolo = '2EQE02120'
La tabella "listini2" ha solo 1 rigo:
'2EQE02120','USD',403.9
Ed ecco com'e fatta la tabella
DROP TABLE IF EXISTS `frigel`.`listini2`;
CREATE TABLE  `frigel`.`listini2` (
   `codicearticolo` varchar(15) NOT NULL default '',
   `codicelistino` char(3) NOT NULL default '',
   `prezzo` float default NULL,
   PRIMARY KEY  (`codicearticolo`,`codicelistino`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


La differenza sta nel fatto che, nel primo caso, il valore viene
restituito come float, mentre nel secondo caso, dalla query annidata,
il risultato viene restituito come double, e pertanto scatta l'approssimazione
susseguente alla trasformazione da float a double.
prova queste espressioni:
create table r1 SELECT listini.prezzo AS prezzo FROM listini WHERE listini.codicelistino = 'USD' AND
listini.codicearticolo = '2EQE02120';
create table r2 SELECT (SELECT listini.prezzo AS prezzo FROM listini WHERE listini.codicelistino = 'USD' AND
listini.codicearticolo = '2EQE02120') as prezzo FROM listini where listini.codicearticolo = '2EQE02120';
desc r1;
+--------+-------+------+-----+---------+-------+
| Field  | Type  | Null | Key | Default | Extra |
+--------+-------+------+-----+---------+-------+
| prezzo | float | YES  |     |         |       |
+--------+-------+------+-----+---------+-------+
desc r2;
+--------+--------+------+-----+---------+-------+
| Field  | Type   | Null | Key | Default | Extra |
+--------+--------+------+-----+---------+-------+
| prezzo | double | YES  |     |         |       |
+--------+--------+------+-----+---------+-------+
Se cambi il tipo di dato del campo prezzo da float a double, hai lo stesso risultato nei due casi:
show create table listini\G
*************************** 1. row ***************************
       Table: listini
Create Table: CREATE TABLE `listini` (
  `codicearticolo` varchar(15) NOT NULL default '',
  `codicelistino` char(3) NOT NULL default '',
  `prezzo` double default NULL,
  PRIMARY KEY  (`codicearticolo`,`codicelistino`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
SELECT listini.prezzo AS prezzo FROM listini WHERE listini.codicelistino = 'USD' AND listini.codicearticolo = '2EQE02120';
+--------+
| prezzo |
+--------+
| 403.9  |
+--------+
SELECT (SELECT listini.prezzo AS prezzo FROM listini WHERE listini.codicelistino = 'USD' AND listini.codicearticolo =
'2EQE02120') as prezzo FROM listini where listini.codicearticolo = '2EQE02120';
+--------+
| prezzo |
+--------+
| 403.9  |
+--------+
ciao
gmax
-- 
 _  _ _  _
(_|| | |(_|><  The Data Charmer
 _|
http://datacharmer.blogspot.com/

 
Perfetto! Ti ringrazio per avermi svelato l'arcano, anche a me sembrava 
un'approssimazione da conversione ma non capivo dove avvenisse.
Certo è che mi sembra un comportamento molto strano, comunque non 
richiesto: non poteva lasciare float?
Sai se è una proprietà di MySql? Oppure è una caratteristica del linguaggio?
Grazie ancora
Ciao
Alessandro