首页 文章

从table1中选择不在table2中的where子句的特定数据

提问于
浏览
2

我想从table1中选择不在table2中的数据,但我必须从table1中选择一个特定的数据

我的数据表

CREATE TABLE IF NOT EXISTS `table3` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `acc_id` int(11) NOT NULL DEFAULT '0',
  `did` int(11) NOT NULL,

  PRIMARY KEY (`id`)
) 



CREATE TABLE IF NOT EXISTS `table2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `acc_id` int(11) NOT NULL,
  `table1_id` int(11) NOT NULL,
  `did` int(11) NOT NULL,

  PRIMARY KEY (`id`)
) 


CREATE TABLE IF NOT EXISTS `table1` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `acc_id` int(11) NOT NULL DEFAULT '0',

  `name` varchar(50) DEFAULT NULL,
 PRIMARY KEY (`id`)

)

我想要做

select name,id from table1 where id !=(select table1_id from table2 join table3 on table2.acc_id=table3.acc_id where table2.did=4759505 and table2.acc_id=2)and table1.acc_id=2

如果子查询返回1行,则上面的查询很好,但如果子查询返回多行则不会

谢谢

1 回答

  • 0

    您只需将 != 更改为 not in

    select name, id
    from table1
    where id not in (select table1_id
                     from table2 join
                          table3
                          on table2.acc_id = table3.acc_id
                          where table2.did = 4759505 and table2.acc_id = 2
                    ) and
          table1.acc_id = 2;
    

    注意:您还应确保子查询中的 table1_id 永远不会 NULL . 在这种情况下, NOT IN 可能不直观 . 通常,我更喜欢 NOT EXISTS

    select name, id
    from table1
    where not exists (select table1_id
                      from table2 join
                           table3
                           on table2.acc_id = table3.acc_id
                           where table2.did = 4759505 and table2.acc_id = 2 and
                                 table1_id = table1.id
                     ) and
          table1.acc_id = 2;
    

    这样可以更直观地处理 NULL 值 .

相关问题