我想从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的表结构与上面的相同
答案 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
值的更直观的行为。