关于表自身关联的问题,高分求教!!!

无名de旅人 2009-08-07 12:19:48
我有一张表
id row value
1 1 a
1 2 b
2 1 c
3 2 d

然后自身关联,想得到这样的一张表
id value1 value2
1 a b
2 c null
3 null d

里面id 和row 是关键字,且row=1或者2 ,也就只说一条编号id的记录可以有1-2条,
且不一定row=1的记录就存在,可能某个id只有row=1的记录,或者只有row=2的记录

现在要把记录合并一下,就像表2那样,不能丢失编号。
大家帮帮小弟,本来想查id-》table1 ,row=1-》table2,row-》table3,然后关联起来
但是不行记录又重复,得不到3 条记录,似乎问题出生在表自己关联上面
...全文
269 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjb211434 2009-08-07
  • 打赏
  • 举报
回复
来晚了
xiequan2 2009-08-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 snoopyxp 的回复:]
我有一张表
id row value
1 1 a
1 2 b
2 1 c
3 2 d

然后自身关联,想得到这样的一张表
id value1 value2
1 a b
2 c null
3 null d

里面id 和row 是关键字,且row=1或者2 ,也就只说一条编号id的记录可以有1-2条,
且不一定row=1的记录就存在,可能某个id只有row=1的记录,或者只有row=2的记录

现在要把记录合并一下,就像表2那样,不能丢失编号。
大家帮帮小弟,本来想查id-》table1 ,row=1-》table2,row-》table3,然后关联起来
但是不行记录又重复,得不到3 条记录,似乎问题出生在表自己关联上面
[/Quote]
IF OBJECT_ID('tb') IS NOT NULL
DROP TABLE tb
GO
CREATE TABLE tb(id int, row int ,value varchar(10))
go
insert tb SELECT
1, 1 ,'a' UNION ALL SELECT
1, 2, 'b' UNION ALL SELECT
2, 1, 'c' UNION ALL SELECT
3, 2, 'd'
go


select * from tb
pivot
(
max(value) for row in([1],[2])
) p

/*
id 1 2
----------- ---------- ----------
1 a b
2 c NULL
3 NULL d

(3 行受影响)


*/

SQL77 2009-08-07
  • 打赏
  • 举报
回复
刚回答一个一样的
黄_瓜 2009-08-07
  • 打赏
  • 举报
回复
--借T_mac的数据以用
IF OBJECT_ID('tb') IS NOT NULL
DROP TABLE tb
GO
CREATE TABLE tb(id int, row int ,value varchar(10))
go
insert tb SELECT
1, 1 ,'a' UNION ALL SELECT
1, 2, 'b' UNION ALL SELECT
2, 1, 'c' UNION ALL SELECT
3, 2, 'd'
go

select id,
value1=max(case row when 1 then value else null end),
value2=max(case row when 2 then value else null end)
from tb
group by id

drop table tb
/*id value1 value2
----------- ---------- ----------
1 a b
2 c NULL
3 NULL d
警告: 聚合或其他 SET 操作消除了空值。

(3 行受影响)

*/
--小F-- 2009-08-07
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(小F 向高手学习)
-- Date :2009-08-07 12:47:59
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
create table [tb]([id] int,[row] int,[value] varchar(1))
insert [tb]
select 1,1,'a' union all
select 1,2,'b' union all
select 2,1,'c' union all
select 3,2,'d'
--------------开始查询--------------------------

select
[id],
value1=max(case row when 1 then [value] else null end),
value2=max(case row when 2 then [value] else null end) from [tb]
group by
[id]

----------------结果----------------------------
/*id value1 value2
----------- ------ ------
1 a b
2 c NULL
3 NULL d

(所影响的行数为 3 行)

警告: 聚合或其它 SET 操作消除了空值。
*/
xxmsuper 2009-08-07
  • 打赏
  • 举报
回复

declare @t table(id int ,row int,value char(1))
insert @t
select 1 ,1 ,'a' union all
select 1 ,2 ,'b' union all
select 2 ,1 ,'c' union all
select 3 ,2 ,'d'
select * from @t

select isnull(A.id,B.id) id,A.value value1,B.value value2 from
(select * from @t where row=1) A
full join
(select * from @t where row=2) B
on A.id=B.id
order by id

id value1 value2
----------- ------ ------
1 a b
2 c NULL
3 NULL d
sdhdy 2009-08-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pt1314917 的回复:]
SQL code--> 测试数据: [tb]ifobject_id('[tb]')isnotnulldroptable[tb]createtable[tb] (idint,rowint,[value]varchar(1))insertinto[tb]select1,1,'a'unionallselect1,2,'b'unionallselect2,1,'c'unionallselect3,2,'d¡­
[/Quote]
这个好。。。
sdhdy 2009-08-07
  • 打赏
  • 举报
回复
declare @tb table(id int ,row int, value varchar(5))

insert @tb select 1, 1 ,'a'
insert @tb select 1, 2 ,'b'
insert @tb select 2, 1 ,'c'
insert @tb select 3, 2 ,'d'

select a.id,
value1=max(case when a.row=1 then a.value when b.row=1 then b.value end),
value2=max(case when a.row=2 then a.value when b.row=2 then b.value end)
from @tb a ,@tb b where a.id=b.id
group by a.id
order by a.id
/*
id value1 value2
----------- ------ ------
1 a b
2 c NULL
3 NULL d

(所影响的行数为 3 行)
*/
pt1314917 2009-08-07
  • 打赏
  • 举报
回复
--> 测试数据: [tb]
if object_id('[tb]') is not null drop table [tb]
create table [tb] (id int,row int,[value] varchar(1))
insert into [tb]
select 1,1,'a' union all
select 1,2,'b' union all
select 2,1,'c' union all
select 3,2,'d'

select id,value1=max(case row when 1 then [value] else null end),
value2=max(case row when 2 then [value] else null end) from [tb]
group by id

--结果:
id value1 value2
----------- ------ ------
1 a b
2 c NULL
3 NULL d
feixianxxx 2009-08-07
  • 打赏
  • 举报
回复
-- =========================================
-- -----------t_mac 小编-------------------
--------------------希望有天成为大虾----
-- =========================================

IF OBJECT_ID('tb') IS NOT NULL
DROP TABLE tb
GO
CREATE TABLE tb(id int, row int ,value varchar(10))
go
insert tb SELECT
1, 1 ,'a' UNION ALL SELECT
1, 2, 'b' UNION ALL SELECT
2, 1, 'c' UNION ALL SELECT
3, 2, 'd'
go
select distinct
ID,
value1=(select value from tb where t.id=id and row=1),
value2=(select value from tb where t.id=id and row=2)
from tb t
go


(4 行受影响)
ID value1 value2
----------- ---------- ----------
1 a b
2 c NULL
3 NULL d
youzhj 2009-08-07
  • 打赏
  • 举报
回复
我来收藏帖子
  • 打赏
  • 举报
回复

IF OBJECT_ID('tb') IS NOT NULL
DROP TABLE tb
GO
CREATE TABLE tb(id int, row int ,value varchar(10))
go
insert tb SELECT
1, 1 ,'a' UNION ALL SELECT
1, 2, 'b' UNION ALL SELECT
2, 1, 'c' UNION ALL SELECT
3, 2, 'd'
go


select * from tb


select distinct id,value1=(select value from tb where row=1 and id =t.id),
value2=(select value from tb where row = 2 and id = t.id)
from tb t

/**
id value1 value2
----------- ---------- ----------
1 a b
2 c NULL
3 NULL d

(所影响的行数为 3 行)

**/
叶子 2009-08-07
  • 打赏
  • 举报
回复
来晚了
SQL77 2009-08-07
  • 打赏
  • 举报
回复
select 
[id],
max(case when row=1 then [value] else null end) AS VALUE1,
max(case when row=2 then [value] else null end) AS VALUE2
from [tb]
group by
[id]

再盗版一下下
华夏小卒 2009-08-07
  • 打赏
  • 举报
回复

declare @a table(id int, row int,[value] varchar(12))
insert @a select
1, 1, 'a' union all select
1, 2, 'b' union all select
2, 1, 'c' union all select
3, 2, 'd'


select id ,datarow1=max(case when row=1 then [value] when row<>1 and row<>2 then null end),
datarow2=max(case when row=2 then [value] when row<>1 and row<>2 then null end)
from @a
group by id

id datarow1 datarow2
----------- ------------ ------------
1 a b
2 c NULL
3 NULL d

警告: 聚合或其他 SET 操作消除了空值。

(3 行受影响)

34,587

社区成员

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

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