首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

sql多条件查询,该怎么解决

2012-08-11 
sql多条件查询问题描述:Table1IdName1Taylor2JimTable2FIdvalueattr123age1boysex226age2boysexTable1 Id

sql多条件查询
问题描述:
  Table1
  Id Name
  1 Taylor
  2 Jim
   
  Table2
  FId value attr
  1 23 age
  1 boy sex
  2 26 age
  2 boy sex

Table1 Id 是主键,Table2 的FId 是外键,对应Table1 的主键


我要查出age大于24,且sex 是boy 的人的name  
结果是:
Name
Jim


sql 怎么写才能使performance比较好,我现在知道方法有两种 1:子查询 2:把Table2 表串2次。
因为我们系统的数据量比较大,当心到后期performance跟不上,所以请大侠们帮帮忙,请教一个好的方法。
谢谢。

[解决办法]
exists應快些
[解决办法]

SQL code
SELECT t1.name FROM t1 WHERE EXISTS   (SELECT 1 FROM t2 WHERE id=t1.id AND (attr='age' AND Value>24))   AND EXISTS   (SELECT 1 FROM t2 WHERE id=t1.id AND (attr='sex' AND Value='boy'));
[解决办法]
SQL code
with t1 as(     select 1 FId  ,'23' value , 'age' attr from dual     union all     select 1 FId  ,'boy' value , 'sex' attr from dual     union all     select 2 FId  ,'26' value , 'age' attr from dual     union all     select 2 FId  ,'boy' value , 'sex' attr from dual),t2 as(     select 1 Id,'Taylor' Name from dual     union all     select 2 Id,'Jim' Name from dual)select t2.Namefrom t2,(select FId,value,attr,lag(value) over(order by FId) c1,rownum rn from t1) t3where t2.Id = t3.FId and mod(t3.rn,2)=0 and t3.c1 > 24     name----------------1    Jim
[解决办法]
提供一种方案供楼主比较。已经进行了测试哦。
http://blog.csdn.net/lithor/article/details/7730624

热点排行