Description:
UNION incorporating a LEFT JOIN yields incorrect result set. Below I have attached the result we achieve in 4.1.1 versus the expected result as appears in 4.0
}}} -------------------------------------------------------------------------
}}} Behavior in Mysql 4.1.1
}}} -------------------------------------------------------------------------
mysql> select concat(Sites_Code,'.',Site_Code) as Value,
-> concat(Sites_Name,' - ',Site_Name) as Name
-> from Sites LEFT JOIN Site on (Site_Sites_ID = Sites_ID)
-> UNION
-> select Sites_Code as Value, Sites_Name as Name
-> from Sites;
+--------+---------------+
| Value | Name |
+--------+---------------+
| NULL | NULL |
| lerner | Lerner Hall |
| INTL | International |
+--------+---------------+
3 rows in set (0.00 sec)
}}} -------------------------------------------------------------------------
}}} Behavior in Mysql 4.0.13
}}} -------------------------------------------------------------------------
mysql> (select concat(Sites_Code,'.',Site_Code) as Value,
concat(Sites_Name,' - ',Site_Name) as Name
from Sites LEFT OUTER JOIN Site on (Site_Sites_ID = Sites_ID))
UNION
(select Sites_Code as Value, Sites_Name as Name from Sites)
order by value;
+-------------------+-------------------------------+
| Value | Name |
+-------------------+-------------------------------+
| NULL | NULL |
| INTL | International |
| lerner | lerner hall |
| lerner.lerner_403 | lerner hall - 403 Lerner Hall |
+-------------------+-------------------------------+
4 rows in set (0.01 sec)
}}} --------------------------------------------------------------------------
}}} However, in mySql 4.1, individual queries yield proper results
}}} --------------------------------------------------------------------------
mysql> select concat(Sites_Code,'.',Site_Code) as Value,
-> concat(Sites_Name,' - ',Site_Name) as Name
-> from Sites LEFT JOIN Site on (Site_Sites_ID = Sites_ID);
+-------------------+-------------------------------+
| Value | Name |
+-------------------+-------------------------------+
| lerner.lerner_403 | Lerner Hall - 403 Lerner Hall |
| NULL | NULL |
+-------------------+-------------------------------+
2 rows in set (0.00 sec)
mysql> select Sites_Code as Value, Sites_Name as Name
-> from Sites;
+--------+---------------+
| Value | Name |
+--------+---------------+
| lerner | Lerner Hall |
| INTL | International |
+--------+---------------+
2 rows in set (0.00 sec)
How to repeat:
}}} --------------------------------------------------------------------------
}}} To Re-Create
}}} --------------------------------------------------------------------------
CREATE TABLE `Sites` (
`Sites_ID` int(11) NOT NULL auto_increment,
`Sites_Code` varchar(50) NOT NULL default '',
`Sites_Name` varchar(255) default NULL,
PRIMARY KEY (`Sites_ID`),
UNIQUE KEY `Sites_Code` (`Sites_Code`)
) TYPE=InnoDB;
CREATE TABLE `Site` (
`Site_ID` int(11) NOT NULL auto_increment,
`Site_Sites_ID` int(11) NOT NULL default '0',
`Site_Code` varchar(50) NOT NULL default '',
`Site_Name` varchar(255) default NULL,
PRIMARY KEY (`Site_Sites_ID`,`Site_ID`),
UNIQUE KEY `Site_ID` (`Site_ID`),
UNIQUE KEY `Site_Code` (`Site_Sites_ID`,`Site_Code`),
CONSTRAINT `0_928` FOREIGN KEY (`Site_Sites_ID`) REFERENCES `Sites` (`Sites_ID`) ON DELETE CASCADE
) TYPE=InnoDB;
insert into Sites values ('', 'lerner', 'lerner hall');
insert into Sites values ('', 'INTL', 'International');
insert into Site values('2', '1', 'lerner_403', '403 Lerner Hall');
select concat(Sites_Code,'.',Site_Code) as Value,concat(Sites_Name,' - ',Site_Name) as Name
from Sites LEFT JOIN Site on (Site_Sites_ID = Sites_ID);
select Sites_Code as Value, Sites_Name as Name
from Sites;
select concat(Sites_Code,'.',Site_Code) as Value,concat(Sites_Name,' - ',Site_Name) as Name
from Sites LEFT JOIN Site on (Site_Sites_ID = Sites_ID)
UNION
select Sites_Code as Value, Sites_Name as Name
from Sites;
Description: UNION incorporating a LEFT JOIN yields incorrect result set. Below I have attached the result we achieve in 4.1.1 versus the expected result as appears in 4.0 }}} ------------------------------------------------------------------------- }}} Behavior in Mysql 4.1.1 }}} ------------------------------------------------------------------------- mysql> select concat(Sites_Code,'.',Site_Code) as Value, -> concat(Sites_Name,' - ',Site_Name) as Name -> from Sites LEFT JOIN Site on (Site_Sites_ID = Sites_ID) -> UNION -> select Sites_Code as Value, Sites_Name as Name -> from Sites; +--------+---------------+ | Value | Name | +--------+---------------+ | NULL | NULL | | lerner | Lerner Hall | | INTL | International | +--------+---------------+ 3 rows in set (0.00 sec) }}} ------------------------------------------------------------------------- }}} Behavior in Mysql 4.0.13 }}} ------------------------------------------------------------------------- mysql> (select concat(Sites_Code,'.',Site_Code) as Value, concat(Sites_Name,' - ',Site_Name) as Name from Sites LEFT OUTER JOIN Site on (Site_Sites_ID = Sites_ID)) UNION (select Sites_Code as Value, Sites_Name as Name from Sites) order by value; +-------------------+-------------------------------+ | Value | Name | +-------------------+-------------------------------+ | NULL | NULL | | INTL | International | | lerner | lerner hall | | lerner.lerner_403 | lerner hall - 403 Lerner Hall | +-------------------+-------------------------------+ 4 rows in set (0.01 sec) }}} -------------------------------------------------------------------------- }}} However, in mySql 4.1, individual queries yield proper results }}} -------------------------------------------------------------------------- mysql> select concat(Sites_Code,'.',Site_Code) as Value, -> concat(Sites_Name,' - ',Site_Name) as Name -> from Sites LEFT JOIN Site on (Site_Sites_ID = Sites_ID); +-------------------+-------------------------------+ | Value | Name | +-------------------+-------------------------------+ | lerner.lerner_403 | Lerner Hall - 403 Lerner Hall | | NULL | NULL | +-------------------+-------------------------------+ 2 rows in set (0.00 sec) mysql> select Sites_Code as Value, Sites_Name as Name -> from Sites; +--------+---------------+ | Value | Name | +--------+---------------+ | lerner | Lerner Hall | | INTL | International | +--------+---------------+ 2 rows in set (0.00 sec) How to repeat: }}} -------------------------------------------------------------------------- }}} To Re-Create }}} -------------------------------------------------------------------------- CREATE TABLE `Sites` ( `Sites_ID` int(11) NOT NULL auto_increment, `Sites_Code` varchar(50) NOT NULL default '', `Sites_Name` varchar(255) default NULL, PRIMARY KEY (`Sites_ID`), UNIQUE KEY `Sites_Code` (`Sites_Code`) ) TYPE=InnoDB; CREATE TABLE `Site` ( `Site_ID` int(11) NOT NULL auto_increment, `Site_Sites_ID` int(11) NOT NULL default '0', `Site_Code` varchar(50) NOT NULL default '', `Site_Name` varchar(255) default NULL, PRIMARY KEY (`Site_Sites_ID`,`Site_ID`), UNIQUE KEY `Site_ID` (`Site_ID`), UNIQUE KEY `Site_Code` (`Site_Sites_ID`,`Site_Code`), CONSTRAINT `0_928` FOREIGN KEY (`Site_Sites_ID`) REFERENCES `Sites` (`Sites_ID`) ON DELETE CASCADE ) TYPE=InnoDB; insert into Sites values ('', 'lerner', 'lerner hall'); insert into Sites values ('', 'INTL', 'International'); insert into Site values('2', '1', 'lerner_403', '403 Lerner Hall'); select concat(Sites_Code,'.',Site_Code) as Value,concat(Sites_Name,' - ',Site_Name) as Name from Sites LEFT JOIN Site on (Site_Sites_ID = Sites_ID); select Sites_Code as Value, Sites_Name as Name from Sites; select concat(Sites_Code,'.',Site_Code) as Value,concat(Sites_Name,' - ',Site_Name) as Name from Sites LEFT JOIN Site on (Site_Sites_ID = Sites_ID) UNION select Sites_Code as Value, Sites_Name as Name from Sites;