读书人

难题1关于同一个表中的查询/插入有关

发布时间: 2012-01-14 20:02:35 作者: rapoo

难题1,关于同一个表中的查询/插入问题!
表T1如下:

ID Name CID1 CID2
01 Zhao 01
02 Qian 01
03 Sun 04
04 Li 02

要求查询插入的效果是: 如果某一行A的CID1的值和其他某行B的ID的值相同,那么就把B的Name插入到A的CID2列中:结果应该如下所示:

ID Name CID1 CID2
01 Zhao 01
02 Qian 01 Zhao
03 Sun 04 Li
04 Li 02 Qian


不知道怎么写好,请大侠执教!
SELECT * FROM T1
WHERE ...



[解决办法]
--如果是要查
Select
A.ID,
A.Name,
A.CID1,
(Case When A.ID = A.CID1 Then A.CID2 Else IsNull(B.Name, ' ') End) As CID2
From
T1 A
Left Join
T1 B
On A.CID1 = B.ID
--如果是要更新
Update
A
Set
CID2 = (Case When A.ID = A.CID1 Then A.CID2 Else IsNull(B.Name, ' ') End)
From
T1 A
Left Join
T1 B
On A.CID1 = B.ID

Select * From T1
[解决办法]
Create Table T1
(IDChar(2),
NameVarchar(10),
CID1Char(2),
CID2Varchar(10))
Insert T1 Select '01 ', 'Zhao ', '01 ', ' '
Union All Select '02 ', 'Qian ', '01 ', ' '
Union All Select '03 ', 'Sun ', '04 ', ' '
Union All Select '04 ', 'Li ', '02 ', ' '
Union All Select '05 ', 'Li ', '06 ', ' '
GO
--如果是要查
Select
A.ID,
A.Name,
A.CID1,
(Case When A.ID = A.CID1 Then A.CID2 Else IsNull(B.Name, ' ') End) As CID2
From
T1 A
Left Join
T1 B
On A.CID1 = B.ID
--如果是要更新
Update
A
Set
CID2 = (Case When A.ID = A.CID1 Then A.CID2 Else IsNull(B.Name, ' ') End)
From
T1 A
Left Join
T1 B
On A.CID1 = B.ID

Select * From T1
GO
Drop Table T1
--Result
/*
IDNameCID1CID2
01Zhao01
02Qian01Zhao
03Sun04Li
04Li02Qian
05Li06
*/

[解决办法]
if object_id( 'pubs..t1 ') is not null
drop table t1
go
create table t1(ID varchar(10),Name varchar(10),CID1 varchar(10),CID2 varchar(10))
insert into t1(ID,Name,CID1,CID2) values( '01 ', 'Zhao ', '01 ', ' ')
insert into t1(ID,Name,CID1,CID2) values( '02 ', 'Qian ', '01 ', ' ')
insert into t1(ID,Name,CID1,CID2) values( '03 ', 'Sun ' , '04 ', ' ')
insert into t1(ID,Name,CID1,CID2) values( '04 ', 'Li ' , '02 ', ' ')


go

update t1
set cid2 = t2.name
from t1,(select * from t1) t2
where t1.cid1 = t2.id and t1.id <> t2.id

select * from t1

drop table t1

/*
ID Name CID1 CID2
---------- ---------- ---------- ----------
01 Zhao 01
02 Qian 01 Zhao
03 Sun 04 Li
04 Li 02 Qian

(所影响的行数为 4 行)
*/
[解决办法]
如果你的情和你的例子一,只是量上有差,用

Update
A
Set
CID2 = (Case When A.ID = A.CID1 Then A.CID2 Else IsNull(B.Name, ' ') End)
From
T1 A
Left Join
T1 B
On A.CID1 = B.ID

更新有

读书人网 >SQL Server

热点推荐