请教一个关于【子查询】作为一列的问题
两张表表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这一列?
上面显示太乱,大家看图清晰些: 展开
表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这一列?
上面显示太乱,大家看图清晰些: 展开
3个回答
展开全部
--结果已完成,要利用到自定义函数,生成测试数据,运行在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
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
展开全部
其实 最核心的问题就在于如何把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的效果。也不难。
思路是函数中一个游标。游标每次取一行数据,再把这个数据拼接起来。中间别忘了加上换行符。
如果你是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的效果。也不难。
思路是函数中一个游标。游标每次取一行数据,再把这个数据拼接起来。中间别忘了加上换行符。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询