请教一个关于【子查询】作为一列的问题

两张表表1:Table_ASIDName----------------1名字12名字23名字3----------------表2:Project_BSIDAccoun... 两张表
表1:Table_A

SID Name
----------------
1 名字1
2 名字2
3 名字3
----------------

表2:Project_B

SID Account
----------------
1 帐号1
1 帐号2
1 帐号3
2 帐号1
2 帐号2
2 帐号3
3 帐号1
3 帐号2
3 帐号3
----------------

现在我想得到这样一个结果:

---------------------------
SID | Name | AccountList
| | 帐号1
1 | 名字1 | 帐号2
| | 帐号3
---------------------------
| | 帐号1
2 | 名字2 | 帐号2
| | 帐号3
---------------------------
| | 帐号1
3 | 名字3 | 帐号2
| | 帐号3
---------------------------

我用下面的语句执行时,提示子查询的返回值多与一个,即构造【AccountList】列时,每个SID行对应的AccountList列返回值是多个的,不允许这样做:

Select Table_A.SID,
Table_A.Name,
(Select Table_B.Account
Where Table_B.SID=Table_A.SID) AS AccountList
From Table_A
Where Table_A.SID=1

【求救】:我应该怎样实现AccountList这一列?
上面显示太乱,大家看图清晰些:
展开
 我来答
带我信乐
2009-10-17 · TA获得超过1353个赞
知道小有建树答主
回答量:680
采纳率:0%
帮助的人:718万
展开全部
--结果已完成,要利用到自定义函数,生成测试数据,运行在SQLSERVER上
CREATE TABLE TABLE_A (SID INT , Name CHAR(10))
INSERT INTO TABLE_A
SELECT 1, '名字1'
UNION ALL SELECT 2, '名字2'
UNION ALL SELECT 3,' 名字3'

CREATE TABLE TABLE_B (SID INT , Account CHAR(10))
INSERT INTO TABLE_B
SELECT 1, '帐号1'
UNION ALL SELECT 1, '帐号2'
UNION ALL SELECT 1,'帐号3'
UNION ALL SELECT 2,'帐号1'
UNION ALL SELECT 2,'帐号2'
UNION ALL SELECT 2,'帐号3'
UNION ALL SELECT 3,'帐号1'
UNION ALL SELECT 3,'帐号2'
UNION ALL SELECT 3,'帐号3'

--生成自定义函数
CREATE FUNCTION dbo.GetAllAccount(@SID INT) RETURNS varchar(8000)
AS
BEGIN
DECLARE @AllAccount varchar(8000)
SET @AllAccount=''
SELECT @AllAccount=@AllAccount+'/'+Account
FROM TABLE_B
WHERE SID=@SID

RETURN @AllAccount
END

--查询数据
SELECT SID,[Name],dbo.GetAllAccount(SID)
FROM TABLE_A
--结果
1 名字1 /帐号1/帐号2/帐号3
2 名字2 /帐号1/帐号2/帐号3
3 名字3 /帐号1/帐号2/帐号3
loveyurui
2009-10-17 · TA获得超过6557个赞
知道大有可为答主
回答量:2892
采纳率:33%
帮助的人:994万
展开全部
其实 最核心的问题就在于如何把account转化成accountlist
如果你是oracle10g以上,那么就用
select sid,replace(wm_concat(account),',',chr(10)) as accountlist from project_b group by sid; 这个能达到转化的效果。
总的sql语句是:
select a.sid,a.name,b.accountlist from table_a a
inner join
(select sid,replace(wm_concat(account),',',chr(10)) as accountlist from project_b group by sid) b
on a.sid=b.sid;

chr(10)是换行符

如果不是oracle10g的话,就有点费周折。
建议你写个函数,这个函数可以起到wm_concat的效果。也不难。
思路是函数中一个游标。游标每次取一行数据,再把这个数据拼接起来。中间别忘了加上换行符。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
djybigeye
2009-10-16 · TA获得超过720个赞
知道小有建树答主
回答量:398
采纳率:100%
帮助的人:306万
展开全部
CREATE TABLE TABLE_B (SID INT , Account CHAR(10))
INSERT INTO TABLE_B
SELECT 1, '帐号1'
UNION ALL SELECT 1, '帐号2'
UNION ALL SELECT 1,' 帐号3'
UNION ALL SELECT 2,'帐号1'
UNION ALL SELECT 2,'帐号2'
UNION ALL SELECT 2,'帐号3'
UNION ALL SELECT 3,'帐号1'
UNION ALL SELECT 3,'帐号2'
UNION ALL SELECT 3,'帐号3'

CREATE TABLE TABLE_A (SID INT , Name CHAR(10))
INSERT INTO TABLE_A
SELECT 1, '名字1'
UNION ALL SELECT 2, '名字2'
UNION ALL SELECT 3,' 名字3'

Select Table_A.SID,
Table_A.Name,
B.Account AS AccountList
From Table_A ,Table_B as B
Where Table_A.SID=1 AND Table_A.SID=B.SID
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式