我现在有A,B两个表,A表数据只有1000条,B表数据有200W条,现在我想列出B表中所有包括有A表address字段的数据,请问各位怎么操作

解决方案 »

  1.   


    SQL> create table ta(idx int,address nvarchar2(30));Table createdSQL> create table tb(idx int,cname nvarchar2(30),address nvarchar2(30));Table createdSQL> insert into ta
      2  select 1,'A' from dual
      3  union
      4  select 2,'B' from dual
      5  union
      6  select 3,'C' from dual;3 rows insertedSQL> insert into tb
      2  select 1,'a','A' from dual
      3  union
      4  select 2,'b','B' from dual
      5  union
      6  select 3,'c','C' from dual
      7  union
      8  select 4,'d','D' from dual
      9  union
     10  select 5,'e','E' from dual
     11  union
     12  select 6,'f','B' from dual;6 rows insertedSQL> select * from tb where exists(select 1 from ta where ta.address = tb.address);                                    IDX CNAME                                                        ADDRESS
    --------------------------------------- ------------------------------------------------------------ ------------------------------------------------------------
                                          1 a                                                            A
                                          2 b                                                            B
                                          3 c                                                            C
                                          6 f                                                            BSQL> 
      

  2.   

    select * from B left join A on A.address=B.address
      

  3.   

    方案一:
    SELECT B.*
    FROM B
    WHERE B.address IN (SELECT address FROM A)方案二:
    SELECT B.*
    FROM B
    WHERE EXISTS(SELECT 1 FROM B WHERE A.address=B.address)  select 1 from mytable;与select anycol(目的表集合中的任意一行) from mytable;与select * from mytable 作用上来说是没有差别的,都是查看是否有记录,一般是作条件用的。select 1 from 中的1是一常量,查到的所有行的值都是它,但从效率上来说,1>anycol>*,因为不用查字典表。
      

  4.   

    select a.* ,b.addr from b , a
    where b.addr like '%'||a.addr||'%'
      

  5.   

    楼上说的方案我也考虑过,但是b表里面有200万条数据,如果没有关联,想想1000*200W条数据的恐怖吧。
    而且用LIKE的模糊检索,得到的结果很可能是错误的。
    如果前面地址都一样,只是门牌或楼号不同,这样的数据也会被检索出来。估计和楼主提出的要求不符了吧。
      

  6.   

    如果这个字段用了索引就可以用
    select   b.*   ,a.addr   from   b   ,   a 
    where   instr(b.addr,a.addr) > 0
      

  7.   

    建议用Exists 替代in,性能会好不少!
      

  8.   

    Maybeyond 
    你提的那个问题,我虽然举了个不是很恰当的比方,但是这是事实,确实是忠告。
    后面我又帮你调查了问题原因,而且跟出帖子,写了解决方案。请你不要发表这种不负责任的言论。
    “完全错误”是什么概念,我已经试验过了,不试验就乱讲?
    或许我真的说错了。但是,请说话负责,“完全错误”,这种话请自重。
    让别人看看,我说的到底错多少?到底有没有错。
      

  9.   

    kulama777 方案一: 
    SELECT   B.* 
    FROM   B 
    WHERE   B.address   IN   (SELECT   address   FROM   A)
    这个不好,因为一条SQL语句能容纳的字节是有上限的他这才1000条,如果是10W条呢。
    6楼方案似乎可行,,因为,他是以某个详细地址为基础的,详细地址里肯定包含XX街XX号之类的唯一信息,所以,能对应LIKE的,也应该是唯一信息,但是有个问题,万一是A表比B表的地址要长,那么就得不到要的结果了。。所以,还真不好找。
      

  10.   

    数据这么多,where条件里最好不要用in,Exists这些关键字,selecdt后面也最好不要写*,会影响效果