问题描述:
     Table1
     Id    Name
     1     Taylor
     2     Jim
   
    Table2
    FId   value  attr
    1      23     age
    1      boy    sex
    2      26     age
    2      boy    sexTable1 Id 是主键,Table2 的FId 是外键,对应Table1 的主键
我要查出age大于24,且sex 是boy 的人的name  
结果是:
Name
Jim
sql 怎么写才能使performance比较好,我现在知道方法有两种 1:子查询 2:把Table2 表串2次。
因为我们系统的数据量比较大,当心到后期performance跟不上,所以请大侠们帮帮忙,请教一个好的方法。
谢谢。

解决方案 »

  1.   

    没有太大的区别,你的两个表结构简单,可以考虑给Table2加索引,才能提高performance
      

  2.   

    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'));
      

  3.   

    谢谢楼上的兄弟们。
    一楼的方法我先study一下。
    我要问的是除了我说的2种方法外还有没有其他更好的办法。
      

  4.   


    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.Name
    from t2,(select FId,value,attr,lag(value) over(order by FId) c1,rownum rn from t1) t3
    where t2.Id = t3.FId and mod(t3.rn,2)=0 and t3.c1 > 24
         name
    ----------------
    1 Jim
      

  5.   

    刚想起来 上面掉了个条件 and value = 'boy'  不知道效率会好点不呢
      

  6.   

    提供一种方案供楼主比较。已经进行了测试哦。
    http://blog.csdn.net/lithor/article/details/7730624