求一SQL语句:子表通过一个非主键属性排除主键所在的所有行,多谢!

hyf_0023 2011-12-14 08:11:53
一个问题:子表通过一个非主键属性排除主键所在的所有行?
比如:

create table tmp_main
(pk_field integer);
insert into tmp_main(pk_field) values(1);
insert into tmp_main(pk_field) values(2);
commit;

with t_detail as(
select 1 as pk_field,'0' as flag_field from dual
union all
select 1 as pk_field,'0' as flag_field from dual
union all
select 1 as pk_field,'1' as flag_field from dual
union all
select 1 as pk_field,'0' as flag_field from dual
union all
select 2 as pk_field,'0' as flag_field from dual
union all
select 2 as pk_field,'0' as flag_field from dual
)

t_detail表里有flag_field = '1'的行,我想把满足这个条件的主键值的所有过滤掉

select b.* FROM tmp_main a,t_detail b where a.pk_field = b.pk_field and ...

想要显示的结果是:
pk_field flag_field
2 0
2 0

请热心朋友帮忙,非常感谢!
...全文
60 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyf_0023 2011-12-14
  • 打赏
  • 举报
回复
我想了个很麻烦的方法
select b.* FROM tmp_main a,
(select pk_field,flag_field FROM (select pk_field,flag_field,count(*) over() as c1,count(*) over(order by pk_field,flag_field) as c2 from t_detail) t where t.c1=t.c2) b
where a.pk_field = b.pk_field

非常感谢,还是您的方法简单。结帖。
007-x 2011-12-14
  • 打赏
  • 举报
回复
没看清需求,见谅
with t_detail as(
select 1 as pk_field,'0' as flag_field from dual
union all
select 1 as pk_field,'0' as flag_field from dual
union all
select 1 as pk_field,'1' as flag_field from dual
union all
select 1 as pk_field,'0' as flag_field from dual
union all
select 2 as pk_field,'0' as flag_field from dual
union all
select 2 as pk_field,'0' as flag_field from dual
)
select b.* FROM t_detail b where not exists (select 1 from t_detail t,tmp_main t2 where b.pk_field=t.pk_field and t2.pk_field=t.flag_field)
007-x 2011-12-14
  • 打赏
  • 举报
回复
不好意思,字段关联错了,修正如下:
with t_detail as(
select 1 as pk_field,'0' as flag_field from dual
union all
select 1 as pk_field,'0' as flag_field from dual
union all
select 1 as pk_field,'1' as flag_field from dual
union all
select 1 as pk_field,'0' as flag_field from dual
union all
select 2 as pk_field,'0' as flag_field from dual
union all
select 2 as pk_field,'0' as flag_field from dual
)
select b.* FROM t_detail b where not exists (select 1 from tmp_main t where b.pk_field=t.pk_field)
hyf_0023 2011-12-14
  • 打赏
  • 举报
回复
多谢,您的写法不能满足,我要求只要有一行flag_field = '1',如例,对应pk_field = 1的所有值全不要
也就是只要pk_field = 2的值。
007-x 2011-12-14
  • 打赏
  • 举报
回复
用not exists
with t_detail as(
select 1 as pk_field,'0' as flag_field from dual
union all
select 1 as pk_field,'0' as flag_field from dual
union all
select 1 as pk_field,'1' as flag_field from dual
union all
select 1 as pk_field,'0' as flag_field from dual
union all
select 2 as pk_field,'0' as flag_field from dual
union all
select 2 as pk_field,'0' as flag_field from dual
)
select b.* FROM t_detail b where not exists (select 1 from tmp_main t where b.flag_field=t.pk_field)

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧