两个表的联合查询.

ruhong1 2016-05-23 07:17:24
表a

id 品名 日期1
1 a1 2011.1.1
2 a1 2011.2.1
3 a1 2011.3.1
4 a2 2011.4.1

表b
id 品名 日期2
1 a1 2012.1.1
2 a1 2012.2.1
3 a3 2012.4.1

我想把两个表联合起来,我要查错,可是他们又没有什么唯一的对应关系.
想要的结果是这样的,,

日期1 品名 日期2
2011.1.1 a1 2012.1.1
2011.2.1 a1 2012.2.1
2011.3.1 a1 null
2011.4.1 a2 null
null a3 2012.4.1

简单的说,就是表a和表b ,品名相同的,按时间顺序,表a在左,表b在右,一直往下排队。
相同的品名,其中行数少的补null,然后再比较下一个品名。
不知道我描述准确没有,sql 语句怎么写。


...全文
148 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2016-05-24
  • 打赏
  • 举报
回复
这样用,把品名分组,日期排序
Go
SELECT a.日期1,ISNULL(a.品名,b.品名) AS 品名,b.日期2 FROM (SELECT ROW_NUMBER()OVER(PARTITION BY [品名] ORDER BY [日期1]) AS RN,* FROM  #a) AS a FULL JOIN (SELECT ROW_NUMBER()OVER(PARTITION BY [品名] ORDER BY [日期2]) AS RN,* FROM  #b) as b ON a.品名=b.品名 AND a.RN=b.RN
ruhong1 2016-05-24
  • 打赏
  • 举报
回复
引用 3 楼 roy_88 的回复:
以相差1年月份比较,这样用
use Tempdb
go
--> --> 
 
if not object_id(N'Tempdb..#a') is null
	drop table #a
Go
Create table #a([id] int,[品名] nvarchar(22),[日期1] Date)
Insert #a
select 1,N'a1','2011.1.1' union all
select 2,N'a1','2011.2.1' union all
select 3,N'a1','2011.3.1' union all
select 4,N'a2','2011.4.1'
Go
use Tempdb
go
--> --> 
 
if not object_id(N'Tempdb..#b') is null
	drop table #b
Go
Create table #b([id] int,[品名] nvarchar(22),[日期2] Date)
Insert #b
select 1,N'a1','2012.1.1' union all
select 2,N'a1','2012.2.1' union all
select 3,N'a3','2012.4.1'
Go
SELECT a.日期1,ISNULL(a.品名,b.品名) AS 品名,b.日期2 FROM #a AS a FULL JOIN #b as b ON a.品名=b.品名 AND DATEADD(yy,1,a.日期1)=b.日期2
/*
日期1	品名	日期2
2011-01-01	a1	2012-01-01
2011-02-01	a1	2012-02-01
2011-03-01	a1	NULL
2011-04-01	a2	NULL
NULL	a3	2012-04-01
*/
我的意思是,日期不是关键,我只需要填进去,然后我打算人工来左右一起看。他的日期没有任何规律的。
中国风 2016-05-23
  • 打赏
  • 举报
回复
以相差1年月份比较,这样用
use Tempdb
go
--> --> 
 
if not object_id(N'Tempdb..#a') is null
	drop table #a
Go
Create table #a([id] int,[品名] nvarchar(22),[日期1] Date)
Insert #a
select 1,N'a1','2011.1.1' union all
select 2,N'a1','2011.2.1' union all
select 3,N'a1','2011.3.1' union all
select 4,N'a2','2011.4.1'
Go
use Tempdb
go
--> --> 
 
if not object_id(N'Tempdb..#b') is null
	drop table #b
Go
Create table #b([id] int,[品名] nvarchar(22),[日期2] Date)
Insert #b
select 1,N'a1','2012.1.1' union all
select 2,N'a1','2012.2.1' union all
select 3,N'a3','2012.4.1'
Go
SELECT a.日期1,ISNULL(a.品名,b.品名) AS 品名,b.日期2 FROM #a AS a FULL JOIN #b as b ON a.品名=b.品名 AND DATEADD(yy,1,a.日期1)=b.日期2
/*
日期1	品名	日期2
2011-01-01	a1	2012-01-01
2011-02-01	a1	2012-02-01
2011-03-01	a1	NULL
2011-04-01	a2	NULL
NULL	a3	2012-04-01
*/
ruhong1 2016-05-23
  • 打赏
  • 举报
回复
引用 1 楼 roy_88 的回复:
SELECT a.日期1,ISNULL(a.品名,b.品名) AS 品名,b.日期2 FROM a FULL JOIN b ON a.品名=b.品名 AND a.日期1=b.日期2
用full join
我误导版主了,他们的时间是不对应的。
中国风 2016-05-23
  • 打赏
  • 举报
回复
SELECT a.日期1,ISNULL(a.品名,b.品名) AS 品名,b.日期2 FROM a FULL JOIN b ON a.品名=b.品名 AND a.日期1=b.日期2
用full join

34,590

社区成员

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

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