UNION ALL而不是IN

时间:2014-07-12 13:58:38

标签: mysql union

我想从module_idx和module_idx_pool表中选择两个表中没有相同listid列的所有行。

如果listid在两个表中,我只想从module_idx表中选择行。

SELECT * FROM module_idx    
UNION ALL
SELECT * FROM module_idx_pool WHERE listid NOT IN ( SELECT listid FROM module_idx )

此语句仅返回module_idx中的行而不返回其他行。

CREATE TABLE IF NOT EXISTS `module_idx` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`umodule` int(10) DEFAULT '0',
`accid` int(10) DEFAULT '0',
`images` text,
`address` varchar(60) DEFAULT '',
`city` varchar(30) DEFAULT '',
`county` varchar(30) DEFAULT '',
`state` varchar(20) DEFAULT '',
`zip` varchar(12) DEFAULT '',
`price` varchar(20) DEFAULT '',
`listid` varchar(25) DEFAULT '',
`details` text,
`latlng` varchar(30) DEFAULT '',
`baths` int(11) DEFAULT '0',
`bedrooms` int(1) DEFAULT '0',
`sqft` int(6) DEFAULT '0',
`acres` int(6) DEFAULT '0',
`proptype` varchar(30) DEFAULT '',
`detailsurl` varchar(40) DEFAULT '',
`content` text,
`status` varchar(20) DEFAULT 'active',
`type` varchar(10) DEFAULT 'feat',
`subdivision` varchar(80) DEFAULT NULL,
`extra` text,
PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1501 ;

module_idx_pool的表结构与上面的相同

1 个答案:

答案 0 :(得分:0)

原因可能是NULL值。您可以通过两种方式解决此问题:

SELECT * FROM module_idx    
UNION ALL
SELECT *
FROM module_idx_pool
WHERE listid NOT IN (SELECT listid FROM module_idx WHERE listid is not null)

或者,最好的方法是使用not exists

SELECT * FROM module_idx    
UNION ALL
SELECT *
FROM module_idx_pool ip 
WHERE NOT EXISTS (SELECT 1 FROM module_idx i WHERE i.listid = ip.listid);
只要子查询的值为NOT IN

NULL就会返回NULL。从处理NULL值的角度来看,这是有道理的 - 因为您不知道给定值是否在列表中。但是,这有点违反直觉。 NOT EXITS具有忽略NULL值的更直观的行为。