第一个表: ID Name
1 wjy第二个表 : ID Menu 1 第一个
2 第二个
3 第三个
第三个关系表: ID OneID TwoID
1 1 1
2 1 2
3 1 3
我现有个列表只要读一行 1 wjy怎么与它有关系的也读到这一行上的(比如第二个表通过第三个表跟它有关系的!把有关系的那三个也写到这一行上的
)1 wjy ...
..这个就是跟它有关系的那三个要怎么写啊!
1 wjy第二个表 : ID Menu 1 第一个
2 第二个
3 第三个
第三个关系表: ID OneID TwoID
1 1 1
2 1 2
3 1 3
我现有个列表只要读一行 1 wjy怎么与它有关系的也读到这一行上的(比如第二个表通过第三个表跟它有关系的!把有关系的那三个也写到这一行上的
)1 wjy ...
..这个就是跟它有关系的那三个要怎么写啊!
1 wjy 1,2,3
..这个就是跟它有关系的那三个要怎么写啊!中,
1 wjy ...
后面的三个点补充完整,不然实在不能理解你究竟是什么样的连接.
合并分拆表数据 整理人:中国风(Roy) 日期:2008.06.06
******************************************************************************************************************************************************/ --> --> (Roy)生成測試數據 if not object_id('Tab') is null
drop table Tab
Go
Create table Tab([Col1] int,[Col2] nvarchar(1))
Insert Tab
select 1,N'a' union all
select 1,N'b' union all
select 1,N'c' union all
select 2,N'd' union all
select 2,N'e' union all
select 3,N'f'
Go 合并表: SQL2000用函数: go
if object_id('F_Str') is not null
drop function F_Str
go
create function F_Str(@Col1 int)
returns nvarchar(100)
as
begin
declare @S nvarchar(100)
select @S=isnull(@S+',','')+Col2 from Tab where Col1=@Col1
return @S
end
go
Select distinct Col1,Col2=dbo.F_Str(Col1) from Tab go SQL2005用XML: 方法1: select
a.Col1,Col2=stuff(b.Col2.value('/R[1]','nvarchar(max)'),1,1,'')
from
(select distinct COl1 from Tab) a
Cross apply
(select COl2=(select N','+Col2 from Tab where Col1=a.COl1 For XML PATH(''), ROOT('R'), TYPE))b 方法2: select
a.Col1,COl2=replace(b.Col2.value('/Tab[1]','nvarchar(max)'),char(44)+char(32),char(44))
from
(select distinct COl1 from Tab) a
cross apply
(select Col2=(select COl2 from Tab where COl1=a.COl1 FOR XML AUTO, TYPE)
.query(' <Tab>
{for $i in /Tab[position() <last()]/@COl2 return concat(string($i),",")}
{concat("",string(/Tab[last()]/@COl2))}
</Tab>')
)b SQL05用CTE: ;with roy as(select Col1,Col2,row=row_number()over(partition by COl1 order by COl1) from Tab)
,Roy2 as
(select COl1,cast(COl2 as nvarchar(100))COl2,row from Roy where row=1
union all
select a.Col1,cast(b.COl2+','+a.COl2 as nvarchar(100)),a.row from Roy a join Roy2 b on a.COl1=b.COl1 and a.row=b.row+1)
select Col1,Col2 from Roy2 a where row=(select max(row) from roy where Col1=a.COl1) order by Col1 option (MAXRECURSION 0)
生成结果:
/*
Col1 COl2
----------- ------------
1 a,b,c
2 d,e
3 f (3 行受影响)
*/
1 wjy 1,2,3
create table t1(ID int,Name varchar(10))
insert into t1 select 1,'wjy'
create table t2(ID int,Menu varchar(10))
insert into t2 select 1,'第一个'
insert into t2 select 2,'第二个'
insert into t2 select 3,'第三个'
create table t3(ID int,OneID int,TwoID int)
insert into t3 select 1,1,1
insert into t3 select 2,1,2
insert into t3 select 3,1,3
go
select a.id 第一列,a.name 第二列,stuff((select ','+ltrim(TwoID) from t3 where OneID=a.id for xml path('')),1,1,'')第三列
from t1 a group by a.id,a.name
/*
第一列 第二列 第三列
----------- ---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 wjy 1,2,3(1 行受影响)*/
go
drop table t1,t2,t3
第三列=stuff((select ','+ltrim(TwoID) from t3 where OneID=a.id for xml path('')),1,1,'')
from t1 a group by a.id,a.name
第三列=stuff((select ','+ltrim(TwoID) from t3 where OneID=a.id for xml path('')),1,1,'')
from t1 a group by a.id,a.name
像这样的语句是写在哪的?我数据库不是不好的!
把这段语句
select a.id 第一列,a.name 第二列,stuff((select ','+ltrim(TwoID) from t3 where OneID=a.id for xml path('')),1,1,'')第三列
from t1 a group by a.id,a.name当成基本查询语句让连接对象去exec,返回记录集对象就能显示了.可以事先在SQL 2005 查询窗口运行一下,你就能看到结果了.