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>
select * from B left join A on A.address=B.address
方案一: 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>*,因为不用查字典表。
select a.* ,b.addr from b , a where b.addr like '%'||a.addr||'%'
kulama777 方案一: SELECT B.* FROM B WHERE B.address IN (SELECT address FROM A) 这个不好,因为一条SQL语句能容纳的字节是有上限的他这才1000条,如果是10W条呢。 6楼方案似乎可行,,因为,他是以某个详细地址为基础的,详细地址里肯定包含XX街XX号之类的唯一信息,所以,能对应LIKE的,也应该是唯一信息,但是有个问题,万一是A表比B表的地址要长,那么就得不到要的结果了。。所以,还真不好找。
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>
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>*,因为不用查字典表。
where b.addr like '%'||a.addr||'%'
而且用LIKE的模糊检索,得到的结果很可能是错误的。
如果前面地址都一样,只是门牌或楼号不同,这样的数据也会被检索出来。估计和楼主提出的要求不符了吧。
select b.* ,a.addr from b , a
where instr(b.addr,a.addr) > 0
你提的那个问题,我虽然举了个不是很恰当的比方,但是这是事实,确实是忠告。
后面我又帮你调查了问题原因,而且跟出帖子,写了解决方案。请你不要发表这种不负责任的言论。
“完全错误”是什么概念,我已经试验过了,不试验就乱讲?
或许我真的说错了。但是,请说话负责,“完全错误”,这种话请自重。
让别人看看,我说的到底错多少?到底有没有错。
SELECT B.*
FROM B
WHERE B.address IN (SELECT address FROM A)
这个不好,因为一条SQL语句能容纳的字节是有上限的他这才1000条,如果是10W条呢。
6楼方案似乎可行,,因为,他是以某个详细地址为基础的,详细地址里肯定包含XX街XX号之类的唯一信息,所以,能对应LIKE的,也应该是唯一信息,但是有个问题,万一是A表比B表的地址要长,那么就得不到要的结果了。。所以,还真不好找。