表 A
编号 金额 数据来源
00001 1000 /1370/1371/1372/1373/1374/
表 B
编号 金额
1370 200
1371 100
1372 300
1373 150
1374 250
要实现的查询结果
分类 编号 金额
总计 00001 1000
明细 1370 200
明细 1371 100
明细 1372 300
明细 1373 150
明细 1374 250
查询注释:总计是表A的数据, 明细时表B的数据表B与表A通过数据来愈记录的数据关联时通过查询A表的数据,然后通过数据来源调用B表的明细数据,这只是个简单的例子,这个查询该怎么写,这是一个问题,另外数据来源字段实际存储的数据绝对不止这几条,最少都在500个记录表B的编号,怎么样可以使其查询速度快?
编号 金额 数据来源
00001 1000 /1370/1371/1372/1373/1374/
表 B
编号 金额
1370 200
1371 100
1372 300
1373 150
1374 250
要实现的查询结果
分类 编号 金额
总计 00001 1000
明细 1370 200
明细 1371 100
明细 1372 300
明细 1373 150
明细 1374 250
查询注释:总计是表A的数据, 明细时表B的数据表B与表A通过数据来愈记录的数据关联时通过查询A表的数据,然后通过数据来源调用B表的明细数据,这只是个简单的例子,这个查询该怎么写,这是一个问题,另外数据来源字段实际存储的数据绝对不止这几条,最少都在500个记录表B的编号,怎么样可以使其查询速度快?
union all
select '明细',编号,金额 from B
select 编号 as id,'总计' as 分类,编号,金额 fron A
union all
select A.编号 as id,'明细',B编号, B.金额 from B inner join A on charindex(B.分类,A.数据来源)>0
)t order by id
if object_id('ta') is not null
drop table ta
go
create table ta(编号 varchar(5), 金额 int,数据来源 varchar(50))
insert into ta
select '00001', 1000, '/1370/1371/1372/1373/1374/'if object_id('tb') is not null
drop table tb
go
create table tb(编号 varchar(5), 金额 int)
insert into tb
select '1370', 200 union all
select '1371', 100 union all
select '1372', 300 union all
select '1373', 150 union all
select '1374', 250declare @s varchar(100)
set @s =(select 数据来源 from ta )
set @s=left(right(@s,len(@s)-1) ,len(right(@s,len(@s)-1))-1)
print @s
declare @tb table (分类 nvarchar(10),编号 varchar(5), 金额 int)
insert into @tb
select '总计',编号,金额 from ta
while charindex('/',@s)>0
begin
insert into @tb
select '明细',编号,金额 from tb
where 编号=left(@s,charindex('/',@s)-1)
set @s=right(@s,len(@s)-charindex('/',@s))
end
insert into @tb
select '明细',编号,金额 from tb
where 编号=@s
select * from @tb 总计 00001 1000
明细 1370 200
明细 1371 100
明细 1372 300
明细 1373 150
明细 1374 250
你写的是对的,不过@s存储不下数据来愈字段的数据怎么办,我们现在那个地方时用TEXT来存储的,也就是说实际的数据来源里面的东西很多,因为表B的编号在不断的变大。varchar到后面存储不下
create table b(编号 varchar(10),金额 int)
insert into a
select ' 00001', 1000, '/1370/1371/1372/1373/1374/'
insert into b
select '1370', 200 union all
select '1371', 100 union all
select '1372', 300 union all
select '1373', 150 union all
select '1374' ,250
go
select 分类='总计' ,编号,金额 from a
union all
select 分类='明细',编号,金额 from b
GO
IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
GO
CREATE TABLE TA
(
编号 nvarchar(50),
金额 int,
数据来源 nvarchar(1000)
)
CREATE TABLE TB
(
编号 nvarchar(50),
金额 int,
)
INSERT INTO TA
SELECT '00001',1000,'/1370/1371/1372/1373/1374/'
INSERT INTO TB
SELECT '1370',200 UNION ALL
SELECT '1371',100 UNION ALL
SELECT '1372',300 UNION ALL
SELECT '1373',150 UNION ALL
SELECT '1374',250
ALTER FUNCTION FindId
(@COL VARCHAR(50))
RETURNS @IdTable TABLE
(编号 VARCHAR(50))
AS
BEGIN
SELECT @COL=数据来源 FROM TA WHERE 编号=@COL
WHILE CHARINDEX('/',@COL)>0
BEGIN
INSERT INTO @IdTable
SELECT LEFT(@COL,CHARINDEX('/',@COL)-1)
SET @COL=STUFF(@COL,1,CHARINDEX('/',@COL),'')
END
IF LEN(@COL)>0
BEGIN
INSERT INTO @IdTable
SELECT @COL
END
RETURN
END
GODECLARE @编号 NVARCHAR(50)
SET @编号='00001'
SELECT '总计' as 分类,编号,金额 FROM TA WHERE 编号=编号 UNION ALL
SELECT '明细',T.编号,T.金额 FROM TB T JOIN (SELECT * FROM FindId(@编号)) AS S ON T.编号=S.编号
union all
select tb.编号,tb.金额 from
(
SELECT A.[values],id=SUBSTRING(A.[values], B.number, CHARINDEX('/', A.[values] + '/', B.number) - B.number),number
FROM ta A,master..spt_values B
WHERE b.type='p' and SUBSTRING( A.[values], B.number, 1) = '/'
) t inner join tb on t.id=tb. 编号
(
编号 nvarchar(50),
金额 int,
数据来源 nvarchar(1000)
)
CREATE TABLE #TB
(
编号 nvarchar(50),
金额 int,
)
INSERT INTO #TA
SELECT '00001',1000,'/1370/1371/1372/1373/1374/'
INSERT INTO #TB
SELECT '1370',200 UNION ALL
SELECT '1371',100 UNION ALL
SELECT '1372',300 UNION ALL
SELECT '1373',150 UNION ALL
SELECT '1374',250 select 分类,编号,金额 from(
select 编号 as id,'总计' as [分类],编号,金额 from #tA
union all
select #tA.编号 as id,'明细'as [分类],#tB.编号, #tB.金额 from #tB inner join #tA on charindex('/'+#tB.编号+'/','/'+#tA.数据来源+'/')>0
)t order by id