table1:  
    pno   pndsc    
    a1    abc1
    a2    abc2
    a3    abc3
   
 table2:
    pno   pndsc    
    a1    abc1
  我希望是两表合并成一个表视图
 table3:
    pno   pndsc   t  
    a1    abc1    1
    a2    abc2    0
    a3    abc3    0
另我十分想了解这样的视图性能如何,因为两表数据量大,而且我需要很频繁操作这个视图,或有什么更佳的方法

解决方案 »

  1.   

    SELECT a.pno,a.pndsc,
           COUNT(b.pno) AS t 
    FROM tb1 AS a
     LEFT OUTER JOIN tb2 AS b
    ON a.pndsc=b.pndsc
      AND a.pno=b.pno
    GROUP BY a.pno,a.pndsc
      

  2.   

    select a.pno,a.pndsc,count(b.pno) as t
    from table1 a left join table2 b
    on a.pno=b.pno and a.pndsc=b.pndsc
    group by a.pno,a.pndsc
      

  3.   

    declare @t1 table(pno varchar(5),pndsc varchar(10))    
    insert @t1 select     'a1'  ,  'abc1' 
    insert @t1 select     'a2'  ,  'abc2' 
    insert @t1 select     'a3'  ,  'abc3' 
    declare @t2 table(pno varchar(5),pndsc varchar(10))      
    insert @t2 select     'a1',    'abc1'
    select pno,pndsc,count(*)-1 t
    from (
    select * from @t1
    union all
    select * from @t2)t 
    group by pno,pndsc /*
    pno   pndsc      t           
    ----- ---------- ----------- 
    a1    abc1       1
    a2    abc2       0
    a3    abc3       0
    */
      

  4.   

    GROUP BY分组对效率损失很大
      

  5.   

    SELECT 
       pno,pndsc,
       t=(SELECT COUNT(*)
          FROM tb2
          WHERE pno=a.pno
             AND pndsc=a.pndsc)
    FROM tb1 AS a
      

  6.   


    declare @t1 table(pno varchar(2),pndsc varchar(4))
    declare @t2 table(pno varchar(2),pndsc varchar(4))
    insert into @t1 select 'a1','abc1'
    union all select 'a2','abc2'
    union all select 'a2','abc3'
    insert @t2  select 'a1','abc1'select a.*,t=(case when a.pno=b.pno then 1 else 0 end)
     from @t1 a left outer 
     join @t2 b on a.pno=b.pno
      

  7.   


    declare @t1 table(pno varchar(2),pndsc varchar(4))
    declare @t2 table(pno varchar(2),pndsc varchar(4))
    insert into @t1 select 'a1','abc1'
    union all select 'a2','abc2'
    union all select 'a2','abc3'insert @t2  select 'a1','abc1'
    insert @t2  select 'a1','abc1'select a.*,t=(case when a.pno=b.pno then 1 else 0 end)
    from @t1 a 
    left outer join @t2 b on a.pno=b.pno
    --结果:
    a1 abc1 1
    a1 abc1 1
    a2 abc2 0
    a2 abc3 0有bug还是要分组
      

  8.   

    那楼上的加个 distinctselect distinct a.*,t=(case when a.pno=b.pno then 1 else 0 end)
    from @t1 a 
        left outer join @t2 b on a.pno=b.pno
    感觉楼主数据太少,所以开始几位都想错了。
      

  9.   

    楼主意思表达不是很清楚
    如果
     table1:  
        pno  pndsc    
        a1    abc1 
        a2    abc2 
        a3    abc3 
      
    table2: 
        pno  pndsc    
        a1    abc1 
        a1    abc1
        a2    abc2
        a3    abc3
    是不是要得到
     table3: 
        pno  pndsc    t  
        a1    abc1    2
        a2    abc2    1 
        a3    abc3    1
    ?????
     
      

  10.   


    似乎其它方法(子查询、distinct,in,exists...)对效率损失更大 ^)^给个参考:select a.pno,a.pndsc,b.t
    from table1 a
    join (select pno,count(1) from table2 group by pno) b
    on a.pno=b.pno
    另外,就2个表的数据,没必要建视图。
      

  11.   

    推荐先聚合再连表
    SELECT a.*,ISNULL(cnt,0) t
    FROM table1 a
    LEFT JOIN 
    (SELECT pno,pndsc,COUNT(*) cnt FROM table2 GROUP BY pno,pndsc) b
    ON a.pno=b.pno AND a.pndsc=b.pndsc
      

  12.   

    szx1999
    我视图还需要与其它表进行联合查询,所以要用视图
      

  13.   


    select a.pno,a.pndsc,b.t from table1 a  join 
    (select table1.pno,table1.pnsdc, count(*) t from table1 join 
                  table2 on table1.pno=table2.pno) b
    on a.pno=b.pno
      

  14.   


    select a.pno,a.pndsc,b.t from table1 a left join 
    (select table1.pno,table1.pnsdc, count(*) t from table1 join 
                  table2 on table1.pno=table2.pno) b
    on a.pno=b.pno