合并查询的语句要怎么写

jielei 2010-06-12 04:30:34
例如:

表a
ProName proid path1 path2 path3
1 2 4 5 7
1 2 3 6 8
1 2 6 6 9
2 3 8 5 7
2 3 3 7 8
2 3 6 6 6



我想得到这样的结果的SQL语句是什么?

ProName proid path1 path2 path3
1 2 4/3/6 5/6/6 7/8/9
2 3 8/3/6 5/7/6 7/8/6


...全文
284 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
jielei 2010-06-13
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 jaydom 的回复:]
SQL code

select productid,shugaopath=stuff((select '/'+shugaopath from shugao where productid=a.productid for xml path('')),1,1,''),
shugaopath2=stuff((select '/'+shugaopath2 fro……
[/Quote]


“xml” 附近的 WHERE 子句错误。
缺少 FROM 子句。
“=” 附近的 WHERE 子句错误。
“FROM” 附近的 WHERE 子句错误。
无法分析查询文本。
jaydom 2010-06-13
  • 打赏
  • 举报
回复
是这样吗?
jaydom 2010-06-13
  • 打赏
  • 举报
回复

select productid,shugaopath=stuff((select '/'+shugaopath from shugao where productid=a.productid for xml path('')),1,1,''),
shugaopath2=stuff((select '/'+shugaopath2 from shugao where productid=a.productid for xml path('')),1,1,''),
shugaopath3=stuff((select '/'+shugaopath3 from shugao where productid=a.productid for xml path('')),1,1,'')
from shugao a
group by productid

productid shugaopath shugaopath2 shugaopath3
2 c/d/n m/n/n t/a/b
3 a/d/n m/t/n t/a/n

jielei 2010-06-13
  • 打赏
  • 举报
回复
不清楚哦,反正查询来的记录和 select * from table的结果一样
ShenLiang2025 2010-06-13
  • 打赏
  • 举报
回复



莫非2K不支持?!根据新数据,测试并无问题.


jielei 2010-06-13
  • 打赏
  • 举报
回复
老大,还是不好使哦,我把问题重新表述一下


表:shugao
字段:productid(int),shugaopath(varchar),shugaopath2(varchar),shugaopath3(varchar)

productid shugaopath shugaopath2 shugaopath3
2 c m t
2 d n a
2 n n b
3 a m t
3 d t a
3 n n n


我想得到这样的结果的SQL语句是什么?

productid shugaopath shugaopath2 shugaopath3
2 c/d/n m/n/n t/a/b
3 a/d/n m/t/n t/a/n

ShenLiang2025 2010-06-13
  • 打赏
  • 举报
回复



--1)<b>修改之</b>表结构
DROP TABLE for_csdn
Go
CREATE TABLE for_csdn
(ProName varchar(30),
proid int,
path1 varchar(30),
path2 varchar(30),
path3 varchar(30)
)
INSERT INTO for_csdn VALUES('1' ,2 ,'4' ,'5' ,'7')
INSERT INTO for_csdn VALUES('1' ,2 ,'3' ,'6' ,'8')
INSERT INTO for_csdn VALUES('1' ,2 ,'6' ,'6' ,'9')
INSERT INTO for_csdn VALUES('2',3 ,'8' ,'5' ,'7')
INSERT INTO for_csdn VALUES('2' ,3 ,'3' ,'7' ,'8')
INSERT INTO for_csdn VALUES('2' ,3, '6' ,'6' ,'6')

INSERT INTO for_csdn VALUES('3' ,4, '4' ,'9' ,'1')
INSERT INTO for_csdn VALUES('3' ,4, '3' ,'0' ,'5')
INSERT INTO for_csdn VALUES('4' ,5, '6' ,'s' ,'7')
INSERT INTO for_csdn VALUES('4' ,6, '6' ,'f' ,'t')
INSERT INTO for_csdn VALUES('4' ,6, '6' ,'t' ,'f')

--2)查询
SELECT ProName,
proid = CASE WHEN proid + '/' = replicate(SUBSTRING(proid,1,CHARINDEX('/',proid)),
LEN (proid) - LEN(REPLACE(proid,'/','')) +1)
THEN SUBSTRING(proid,1,CHARINDEX('/',proid)-1) ELSE
proid END,
path1 = CASE WHEN path1 + '/' = replicate(SUBSTRING(path1,1,CHARINDEX('/',path1)),
LEN (path1) - LEN(REPLACE(path1,'/','')) +1)
THEN SUBSTRING(path1,1,CHARINDEX('/',path1)-1) ELSE
path1 END,
path2 = CASE WHEN path2 + '/' = replicate(SUBSTRING(path2,1,CHARINDEX('/',path2)),
LEN (path2) - LEN(REPLACE(path2,'/','')) +1)
THEN SUBSTRING(path2,1,CHARINDEX('/',path2)-1) ELSE
path2 END,
path3 = CASE WHEN path3 + '/' = replicate(SUBSTRING(path3,1,CHARINDEX('/',path3)),
LEN (path3) - LEN(REPLACE(path3,'/','')) +1)
THEN SUBSTRING(path3,1,CHARINDEX('/',path3)-1) ELSE
path3 END
FROM @t_testd

--3)结果
ProName proid path1 path2 path3
-------------------- -------------------- -------------------- -------------------- --------------------
1 2 4/3/6 5/6/6 7/8/9
2 3 8/3/6 5/7/6 7/8/6
3 4 4/3 9/0 1/5
4 5/6/6 6 s/f/t 7/t/f


jielei 2010-06-13
  • 打赏
  • 举报
回复
楼上的不好使,我运行后没有达到我要的结果,和直接的查询显示的结果一样,另外我做一下补充,proid是int类型,其他的都是varchar类型。
ShenLiang2025 2010-06-13
  • 打赏
  • 举报
回复





--1)数据

SELECT * FROM for_csdn

ProName proid path1 path2 path3
----------- ----------- ----------- ----------- -----------
1 2 4 5 7
1 2 3 6 8
1 2 6 6 9
2 3 8 5 7
2 3 3 7 8
2 3 6 6 6

--2)代码段,第2版本(Shenliang1985):
SET NOCOUNT ON
DECLARE @t_testd TABLE (
t_id INT Identity(1,1),
ProName varchar(20),
proid varchar(20),
path1 varchar(20),
path2 varchar(20),
path3 varchar(20)
)
INSERT @t_testd(ProName)
SELECT DISTINCT ProName FROM for_csdn
--SELECT * FROM @t_testd
DECLARE @t_count INT
SET @t_count=1
---SELECT COUNT(*)FROM @t_testd
WHILE @t_count <=(SELECT COUNT(*)FROM @t_testd)
BEGIN
DECLARE @sql VARCHAR(8000)
DECLARE @sql_1 VARCHAR(8000)
DECLARE @sql_2 VARCHAR(8000)
DECLARE @sql_3 VARCHAR(8000)
DECLARE @sql_4 VARCHAR(8000)

SELECT @sql =ISNULL(@sql +'/' , '') + CAST (A.proid AS varchar(32)) FROM for_csdn A
INNER JOIN @t_testd B
ON A.ProName=B.ProName
AND B.t_id=@t_count

SELECT @sql_1 =ISNULL(@sql_1 +'/' , '') + CAST (A.path1 AS varchar(32)) FROM for_csdn A
JOIN @t_testd B
ON A.ProName=B.ProName
AND B.t_id=@t_count


SELECT @sql_2 =ISNULL(@sql_2 +'/' , '') + CAST (A.path2 AS varchar(32)) FROM for_csdn A
JOIN @t_testd B
ON A.ProName=B.ProName
AND B.t_id=@t_count


SELECT @sql_3 =ISNULL(@sql_3 +'/' , '') + CAST (A.path3 AS varchar(32)) FROM for_csdn A
JOIN @t_testd B
ON A.ProName=B.ProName
AND B.t_id=@t_count

----SELECT @sql
UPDATE @t_testd
SET proid = @sql,
path1 = @sql_1,
path2 = @sql_2,
path3 = @sql_3
WHERE t_id=@t_count

SET @t_count=@t_count+1
SELECT @sql=NULL
SELECT @sql_1=NULL
SELECT @sql_2=NULL
SELECT @sql_3=NULL

--SELECT @t_count
END
-------用REVERSE和中间值判断
SELECT ProName,
proid = CASE WHEN REVERSE(proid) = proid AND SUBSTRING(proid,CAST(ROUND(CAST(LEN(proid) AS FLOAT)/2,0,0)AS INT),CHARINDEX('/',proid)-1) = SUBSTRING(proid,1,CHARINDEX('/',proid)-1)
THEN SUBSTRING(proid,1,CHARINDEX('/',proid)-1) ELSE proid END,
path1 = CASE WHEN REVERSE(path1) = path1 AND SUBSTRING(path1,CAST(ROUND(CAST(LEN(path1) AS FLOAT)/2,0,0)AS INT),CHARINDEX('/',path1)-1) = SUBSTRING(path1,1,CHARINDEX('/',path1)-1)
THEN SUBSTRING(path1,1,CHARINDEX('/',path1)-1) ELSE path1 END,
path2 = CASE WHEN REVERSE(path2) = path2 AND SUBSTRING(path2,CAST(ROUND(CAST(LEN(path2) AS FLOAT)/2,0,0)AS INT),CHARINDEX('/',path2)-1) = SUBSTRING(path2,1,CHARINDEX('/',path2)-1)
THEN SUBSTRING(path2,1,CHARINDEX('/',path2)-1) ELSE path2 END,
path3 = CASE WHEN REVERSE(path3) = path3 AND SUBSTRING(path3,CAST(ROUND(CAST(LEN(path3) AS FLOAT)/2,0,0)AS INT),CHARINDEX('/',path3)-1) = SUBSTRING(path3,1,CHARINDEX('/',path3)-1)
THEN SUBSTRING(path3,1,CHARINDEX('/',path3)-1) ELSE path3 END
FROM @t_testd

--3)结果
ProName proid path1 path2 path3
-------------------- -------------------- -------------------- -------------------- --------------------
1 2 4/3/6 5/6/6 7/8/9
2 3 8/3/6 5/7/6 7/8/6





jielei 2010-06-13
  • 打赏
  • 举报
回复
up ,问题还没解决啊
ShenLiang2025 2010-06-12
  • 打赏
  • 举报
回复



--0)修改之

SELECT * FROM @t_testd

----结果1
t_id ProName proid path1 path2 path3
----------- -------------------- -------------------- -------------------- -------------------- --------------------
1 1 2/2/2 4/3/6 5/6/6 7/8/9
2 2 3/3/3 8/3/6 5/7/6 7/8/6

----修改成

SELECT ProName,
proid = CASE WHEN proid + '/' = replicate(SUBSTRING(proid,1,CHARINDEX('/',proid)),
LEN (proid) - LEN(REPLACE(proid,'/','')) +1)
THEN SUBSTRING(proid,1,CHARINDEX('/',proid)-1) ELSE
proid END,
path1 = CASE WHEN path1 + '/' = replicate(SUBSTRING(path1,1,CHARINDEX('/',path1)),
LEN (path1) - LEN(REPLACE(path1,'/','')) +1)
THEN SUBSTRING(path1,1,CHARINDEX('/',path1)-1) ELSE
path1 END,
path2 = CASE WHEN path2 + '/' = replicate(SUBSTRING(path2,1,CHARINDEX('/',path2)),
LEN (path2) - LEN(REPLACE(path2,'/','')) +1)
THEN SUBSTRING(path2,1,CHARINDEX('/',path2)-1) ELSE
path2 END,
path3 = CASE WHEN path3 + '/' = replicate(SUBSTRING(path3,1,CHARINDEX('/',path3)),
LEN (path3) - LEN(REPLACE(path3,'/','')) +1)
THEN SUBSTRING(path3,1,CHARINDEX('/',path3)-1) ELSE
path3 END
FROM @t_testd

------结果2
ProName proid path1 path2 path3
-------------------- -------------------- -------------------- -------------------- --------------------
1 2 4/3/6 5/6/6 7/8/9
2 3 8/3/6 5/7/6 7/8/6


ChinaITOldMan 2010-06-12
  • 打赏
  • 举报
回复
please refer the above
ShenLiang2025 2010-06-12
  • 打赏
  • 举报
回复



--1)表和数据

CREATE TABLE for_csdn
(ProName int,
proid int,
path1 int,
path2 int,
path3 int
)
INSERT INTO for_csdn VALUES(1 ,2 ,4 ,5 ,7)
INSERT INTO for_csdn VALUES(1 ,2 ,3 ,6 ,8)
INSERT INTO for_csdn VALUES(1 ,2 ,6 ,6 ,9)
INSERT INTO for_csdn VALUES(2 ,3 ,8 ,5 ,7)
INSERT INTO for_csdn VALUES(2 ,3 ,3 ,7 ,8)
INSERT INTO for_csdn VALUES(2 ,3, 6 ,6 ,6)


--2)代码段,先处理如下(待改进):
SET NOCOUNT ON
DECLARE @t_testd TABLE (
t_id INT Identity(1,1),
ProName varchar(20),
proid varchar(20),
path1 varchar(20),
path2 varchar(20),
path3 varchar(20)
)
INSERT @t_testd(ProName)
SELECT DISTINCT ProName FROM for_csdn
--SELECT * FROM @t_testd
DECLARE @t_count INT
SET @t_count=1
---SELECT COUNT(*)FROM @t_testd
WHILE @t_count <=(SELECT COUNT(*)FROM @t_testd)
BEGIN
DECLARE @sql VARCHAR(8000)
DECLARE @sql_1 VARCHAR(8000)
DECLARE @sql_2 VARCHAR(8000)
DECLARE @sql_3 VARCHAR(8000)
DECLARE @sql_4 VARCHAR(8000)

SELECT @sql =ISNULL(@sql +'/' , '') + CAST (A.proid AS varchar(32)) FROM for_csdn A
JOIN @t_testd B
ON A.ProName=B.ProName
AND B.t_id=@t_count

SELECT @sql_1 =ISNULL(@sql_1 +'/' , '') + CAST (A.path1 AS varchar(32)) FROM for_csdn A
JOIN @t_testd B
ON A.ProName=B.ProName
AND B.t_id=@t_count


SELECT @sql_2 =ISNULL(@sql_2 +'/' , '') + CAST (A.path2 AS varchar(32)) FROM for_csdn A
JOIN @t_testd B
ON A.ProName=B.ProName
AND B.t_id=@t_count


SELECT @sql_3 =ISNULL(@sql_3 +'/' , '') + CAST (A.path3 AS varchar(32)) FROM for_csdn A
JOIN @t_testd B
ON A.ProName=B.ProName
AND B.t_id=@t_count

----SELECT @sql
UPDATE @t_testd
SET proid = @sql,
path1 = @sql_1,
path2 = @sql_2,
path3 = @sql_3
WHERE t_id=@t_count

SET @t_count=@t_count+1
SELECT @sql=NULL
SELECT @sql_1=NULL
SELECT @sql_2=NULL
SELECT @sql_3=NULL

--SELECT @t_count
--SELECT * FROM @t_testd
END

SELECT * FROM @t_testd



--3)结果
t_id ProName proid path1 path2 path3
----------- -------------------- -------------------- -------------------- -------------------- --------------------
1 1 2/2/2 4/3/6 5/6/6 7/8/9
2 2 3/3/3 8/3/6 5/7/6 7/8/6




永生天地 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jielei 的回复:]
能给一个可以直接可以conn.execute执行的SQL语句吗?
[/Quote]
是ado对象。。。
caixia615 2010-06-12
  • 打赏
  • 举报
回复
2000只能通过函数或者 游标处理
jielei 2010-06-12
  • 打赏
  • 举报
回复
帮帮忙啊,在线等
jielei 2010-06-12
  • 打赏
  • 举报
回复
能给一个可以直接可以conn.execute执行的SQL语句吗?
caixia615 2010-06-12
  • 打赏
  • 举报
回复
create function f_hb(@a int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + '/' + cast(path1 as varchar) from tb where proid = @a
set @str = right(@str , len(@str) - 1)
return(@str)
End
go
select distinct ProName ,proid, f_hb(proid)path1 from tb

path2,path3类似通过函数处理
jielei 2010-06-12
  • 打赏
  • 举报
回复
嗯,sql server 2000
caixia615 2010-06-12
  • 打赏
  • 举报
回复
数据库是2000的?
加载更多回复(3)

34,590

社区成员

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

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