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 列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'
解决方案 »
- 100分送,急,SQL Server 2000误更新了数据(update语句)如何用日志恢复操作前的数据??
- 数据库提示:数据提供程序或其他服务返回E_FAIL 状态!!!
- 给存储过程中in条件传参数
- 工厂模式
- 在MSSQL中写一个触发器,急用
- 迟来的一贴!
- 如何制作 具有剪切、复制、粘贴、撤消、重做、等功能的菜单?
- A窗体中新建B窗体,B中再新建C窗体, C窗中有一个BUTTON按一下如何使A窗体的一个LABEL。TEXT=“某值“
- 分辨率难道不是统一的???
- 无分隔符字符串转换为日期类型
- 关于text属性字段中的html标签替换的问题
- 字段a,字段b,新表字段c,字段a字段b是一个数字区间,如果依次插入到新的一张表字段C里面
--测试数据
;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'结果:
直接连接即可。
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'
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
直接连接即可。
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 那个希望赐教。
擦没引用上?@Tiger_Zhao
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也能查出上面的效果呢?
;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