请教个SQL 谢谢

快乐乔巴 2017-03-07 01:49:50
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'
...全文
405 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
mark_lirenhe 2017-03-10
  • 打赏
  • 举报
回复
各位大神,能不能讲讲各位的思路啊。
道素 2017-03-10
  • 打赏
  • 举报
回复

;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
Tiger_Zhao 2017-03-08
  • 打赏
  • 举报
回复
UNION ALL 是最简单的。
快乐乔巴 2017-03-08
  • 打赏
  • 举报
回复
多谢大家,我想要的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也能查出上面的效果呢?
Tiger_Zhao 2017-03-07
  • 打赏
  • 举报
回复
二月十六 版主 2017-03-07
  • 打赏
  • 举报
回复
引用 4 楼 sinat_28984567 的回复:
恩确实直接连接就行了,写复杂了 对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
张三         物理         93
top n 那个希望赐教。
擦没引用上?@Tiger_Zhao
二月十六 版主 2017-03-07
  • 打赏
  • 举报
回复
引用 2 楼 Tiger_Zhao 的回复:
[Quote=引用 1 楼 sinat_28984567 的回复:]语句:...[/Quote] 没有 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
张三         物理         93
top n 那个希望赐教。
0与1之间 2017-03-07
  • 打赏
  • 举报
回复

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
Tiger_Zhao 2017-03-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sinat_28984567 的回复:]语句:...[/Quote]
没有 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'
二月十六 版主 2017-03-07
  • 打赏
  • 举报
回复
语句:
--测试数据
;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'


结果:

34,874

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧