对ID列进行分类整理的SQL查询

日期: 2011-10-17 作者:Karen Morton翻译:孙瑞 来源:TechTarget中国 英文

问:下面显示的只是我数据库的一部分,其中有更多的表、列以及属性,所以重新设计schema已经不太可能了。希望您能够为我提供一些帮助。

create table my_master (id number,ref number);
create table my_detail (id number,txt varchar2(8));
insert into my_master (id,ref) values (1,1);
insert into my_master (id,ref) values (1,2);
insert into my_master (id,ref) values (1,3);
insert into my_master (id,ref) values (2,1);
insert into my_master (id,ref) values (2,4);
insert into my_master (id,ref) values (2,5);
insert into my_master (id,ref) values (3,6);
insert into my_master (id,ref) values (3,7);
insert into my_master (id,ref) values (4,7);
insert into my_detail (id,txt) values (1,’HELLO1′);
insert into my_detail (id,txt) values (2,’HELLO2′);
insert into my_detail (id,txt) values (3,’HELLO3′);
insert into my_detail (id,txt) values (4,’HELLO4′);
insert into my_detail (id,txt) values (5,’HELLO5′);
insert into my_detail (id,txt) values (6,’HELLO5′);
insert into my_detail (id,txt) values (7,’HELLO6′);

SQL> select t1.id,t1.ref,t2.txt from my_master t1,my_detail t2 where t1.ref = t2.id;

       ID        REF TXT
———- ———- ——–
        1          1 HELLO1
        1          2 HELLO2
        1          3 HELLO3
        2          1 HELLO1
        2          4 HELLO4
        2          5 HELLO5
        3          6 HELLO5
        3          7 HELLO6
        4          7 HELLO6
 
9 rows selected.

  现在我希望通过一个查询语句解决以下问题:

  1、我想要找到所有的ID列,其中包含一个且仅包含一个“HELLO6”的值,比如ID=4;

  2、我想要找到所有的ID列,其中TXT=“HELLO5”AND“HELLO6”,比如ID=3.

  答:想要得到你要的结果,可以有多种方式,但是只有一种方式是相对直接的,希望我能在这里为你解释清楚。同时,你要注意必须在my_detail(参考txt)上建立索引,让内部查询性能更好,此外还需要在my_master上建立恰当的索引。

  1)针对第一个问题:

SQL> select id
 2  from my_master
 3  where id in
 4  (
 5  select t1.id
 6  from my_master t1, my_detail t2
 7  where t1.ref = t2.id
 8  and t2.txt = ‘HELLO6’
 9  )
10  group by id
11  having count(*) = 1;
            ID
—————
             4

  2)针对第二个问题:

SQL> select id
 2  from
 3  (
 4  select t1.id
 5  from my_master t1, my_detail t2
 6  where t1.ref = t2.id
 7  and t2.txt IN (‘HELLO5’, ‘HELLO6’)
 8  )
 9  group by id
10  having count(*) = 2 ;
            ID
—————
             3

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

翻译

孙瑞
孙瑞

相关推荐