T-SQL 问题

superman139 2012-05-31 02:03:28
RT 这是源表dbo.abc
id dbname account
1 db-1 sa
2 db-1 cn\A
3 db-1 cn\B
4 db-2 sa
5 db-2 cn\C
6 db-3 cn\D
7 db-3 cn\E
8 db-4 admin

我的代码及其想要的结果:

SELECT
t3.dbname_1 AS 数据库名,
MAX(ISNULL(t3.account_1,'')+';'+ISNULL(t3.account_2,'')+';'+ISNULL(t4.account,'')) AS 对应账号
FROM
(SELECT t1.id AS id_1,t1.dbname AS dbname_1,t1.account AS account_1
,t2.id AS id_2,t2.dbname AS dbname_2,t2.account AS account_2
FROM dbo.abc t1
LEFT JOIN dbo.abc t2
ON t1.dbname=t2.dbname AND t1.account<>t2.account) t3
LEFT JOIN dbo.abc t4
ON t3.dbname_1=t4.dbname AND t3.account_1<>t4.account AND t3.account_2<>t4.account
GROUP BY t3.dbname_1


结果:
数据库名 对应账号
db-1 sa;cn\B;cn\A
db-2 sa;cn\C;
db-3 cn\E;cn\D;
db-4 admin;;

=========================分割线================
显然我的代码没有扩展性。但我想不出好的方法来实现这个功能了。而且我想用一段t-sql,而不用存储过程或者函数(可以过程实现)实现。

有高手请教一下吗?
...全文
51 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
superman139 2012-05-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
SQL code

select dbname as [数据库名],
[对应账号]=stuff((select ';'+account from abc where dbname=a.dbname for xml path('')),1,1,'')
from abc a
group by id
[/Quote]

我改成这样就对了。

select DISTINCT dbname as [数据库名],
[对应账号]=stuff((select ';'+account from abc where dbname=a.dbname for xml path('')),1,1,'')
from abc a

搞明白了,真巧妙啊,谢谢lordbaby了啊,啊哈哈

superman139 2012-05-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
SQL code


select dbname as [数据库名],
[对应账号]=stuff((select ';'+account from abc where dbname=a.dbname for xml path('')),1,1,'')
from abc a
group by id
[/Quote]

Column 'abc.dbname' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
报错了说= =
迪迦凹凸曼 2012-05-31
  • 打赏
  • 举报
回复

select dbname as [数据库名],
[对应账号]=stuff((select ';'+account from abc where dbname=a.dbname for xml path('')),1,1,'')
from abc a
group by id

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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