q:一个表中的一个字段在另外两个表(结构一样)中关联,怎样一次性将两表数据都查出来
例:
create table ss (id int ,name varchar(22));
create table c1( id int ,name VARCHAR(22),ss_id int);
create table c2( id int ,name VARCHAR(22),ss_id int);
表ss的id和表c1或c2中ss_id关联,表c1和c2结构一致
期望:查询出ss表id在c1和c2中存在的所有字段信息 ,不使用union

解决方案 »

  1.   

    select c1.*,c2.* 
       from ss,c1,c2
       where ss.id = c1.ss_id
       or ss.id = c2.ss_id
    这个意思?
      

  2.   

    第一种
    select * from ss INNER   JOIN c1 on ss.id=c1.ss_id  
    union all
    select * from ss INNER   JOIN c2 on ss.id=c2.ss_id  
    第二种
    select ss.*,c1.* from ss,c1   where 
    EXISTS (select SS.id from  c1 where ss.id=c1.ss_id )
    or
    EXISTS (select SS.id from  c2 where  ss.id=c2.ss_id )
    这个意思  这表ss有100W数据,c1和c2加起来分这100W  ,想找找有没有更优化的方式
      

  3.   

    第一种
    select * from ss INNER   JOIN c1 on ss.id=c1.ss_id  
    union all
    select * from ss INNER   JOIN c2 on ss.id=c2.ss_id  
    第二种
    select ss.*,c1.* from ss,c1   where 
    EXISTS (select SS.id from  c1 where ss.id=c1.ss_id )
    or
    EXISTS (select SS.id from  c2 where  ss.id=c2.ss_id )
    第三种
    select * from ss INNER   JOIN (
    select c1.* from  c1   
    union all
    select c2.* from  c2   ) tmp
    on ss.id=tmp.id 
    第四种
    select * from ss LEFT   JOIN c1 on ss.id=c1.ss_id LEFT   JOIN c2 on ss.id=c2.ss_id 
    where c1.ss_id is not null or c2.ss_id is not null
    第5种
    select SS.*,ifnull(c1.id,c2.id) c_id ,ifnull(c1.name,c2.name) c_name,ifnull(c1.ss_id,c2.ss_id) c_ssid  from
    ss LEFT   JOIN c1 on ss.id=c1.ss_id LEFT   JOIN c2 on ss.id=c2.ss_id 
    where c1.ss_id is not null or c2.ss_id is not null
    望指正,三张表都是大数据下,求最优查询
      

  4.   

    使用union,推荐:
    select c1.* from c1 
    where exists (select 1 from ss where c1.ss_id=ss.id)
    union all
    select c2.* from c2 
    where exists (select 1 from ss where c2.ss_id=ss.id)不使用union,采用你的第二种