TBALE
列1 列2 列3 列4
A null null A1
B B1 B2 B3
B B4 B5 B6
C C1 C2 C3
C C4 C5 C6
说明:列1的数据  比如店家    A店 B店 C店
如果写sql  查找A店信息,那就只能查出如下的信息
A null null A1由于A店列2,和列3的数据  都是存在B店和C店的,列4除外是A店特有的,  
所以查询的时候,想查询A店信息时,A店的列2和列3  要从B,C店里取,结果如下A B1 B2 A1
A B4 B5 A1
A C1 C2 A1
A C4 C5 A1请问这样的sql 如何写呀?
select (?) where 列1 = 'A'

解决方案 »

  1.   

    语句:
    --测试数据
    ;WITH tab(列1,列2,列3,列4)AS(
    select 'A',NULL,NULL,'A1'  union all 
    select 'B','B1','B2','B3'  union all 
    select 'B','B4','B5','B6'  union all 
    select 'C','C1','C2','C3'  union all 
    select 'C','C4','C5','C6'
    )
    --测试数据结束
    SELECT  a.列1 ,
            t.列2 ,
            t.列3 ,
            a.列4
    FROM    tab a
            CROSS APPLY ( SELECT    *
                          FROM      tab b
                          WHERE     a.列1 <> b.列1
                        ) t
    WHERE   a.列1 = 'A'结果:
      

  2.   

    没有 TOP n 过滤,CROSS APPLY 没意义。
    直接连接即可。
        SELECT a.列1,
               t.列2,
               t.列3,
               a.列4
          FROM tab a
     LEFT JOIN tab t
            ON a.列1 <> t.列1
         WHERE a.列1 = 'A'
      

  3.   


    WITH T1(列1,列2,列3,列4)AS(
    select 'A',NULL,NULL,'A1'  union all 
    select 'B','B1','B2','B3'  union all 
    select 'B','B4','B5','B6'  union all 
    select 'C','C1','C2','C3'  union all 
    select 'C','C4','C5','C6'
    )
    Select a.列1,b.列2,b.列3,a.列4 from T1 a ,T1 b where a.列1='A' and a.列1<>b.列1
      

  4.   

    没有 TOP n 过滤,CROSS APPLY 没意义。
    直接连接即可。
        SELECT a.列1,
               t.列2,
               t.列3,
               a.列4
          FROM tab a
     LEFT JOIN tab t
            ON a.列1 <> t.列1
         WHERE a.列1 = 'A'恩确实直接连接就行了,写复杂了
    对CROSS APPLY 的top n 过滤不太了解,我只理解到这种
    create table #T(姓名 varchar(10))
    insert into #T values('张三')
    insert into #T values('李四')
    insert into #T values(NULL )
     
     
    create table #T2(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
    insert into #T2 values('张三' , '语文' , 74)
    insert into #T2 values('张三' , '数学' , 83)
    insert into #T2 values('张三' , '物理' , 93)
    insert into #T2 values(NULL , '数学' , 50)
     
    --drop table #t,#T2
    go
     
    select 
        * 
    from 
        #T a
    cross apply
        (select 课程,分数 from #t2 where 姓名=a.姓名) b
     
    /*
    姓名         课程         分数
    ---------- ---------- -----------
    张三         语文         74
    张三         数学         83
    张三         物理         93top n 那个希望赐教。
      

  5.   


    擦没引用上?@Tiger_Zhao
      

  6.   

    多谢大家,我想要的A结果出来了,如果把ABC三家店的信息全出来怎么写呢
    A B1 B2 A1
    A B4 B5 A1
    A C1 C2 A1
    A C4 C5 A1
    B B1 B2 B3
    B B4 B5 B6
    C C1 C2 C3
    C C4 C5 C6难道要用union  拼接起来么(先查A结果 后面union查BC的),有没有不用拼接 直接一句sql也能查出上面的效果呢?
      

  7.   

    UNION ALL 是最简单的。
      

  8.   


    ;WITH tab(列1,列2,列3,列4)AS(
    select 'A',NULL,NULL,'A1'  union all 
    select 'B','B1','B2','B3'  union all 
    select 'B','B4','B5','B6'  union all 
    select 'C','C1','C2','C3'  union all 
    select 'C','C4','C5','C6'
    )
    SELECT a.列1,
               ISNULL(t.列2,a.列2) 列2,
              isnull( t.列3,a.列3) 列3,
               a.列4
          FROM tab a
     LEFT JOIN tab t
            ON a.列1= CASE WHEN a.列1='A' THEN CASE WHEN t.列1='A' THEN '' ELSE 'A'END  ELSE  t.列1 END 
            AND t.列2=CASE WHEN a.列1='A' THEN t.列2 ELSE NULL END 列1   列2   列3   列4
    ---- ---- ---- ----
    A    B1   B2   A1
    A    B4   B5   A1
    A    C1   C2   A1
    A    C4   C5   A1
    B    B1   B2   B3
    B    B4   B5   B6
    C    C1   C2   C3
    C    C4   C5   C6