我正在制作C#Windows Form Application,它连接到数据库 主题是:书店。
在其中一个应用程序表单中,有DataGridView,它显示有关商店中每本书的信息 在数据库中,一本书是独一无二的,其ISBN和不同的书籍在这种情况下可以具有相同的名称 此外,书籍可以有很多作者 这意味着,当我查询显示所有书籍时,它会多次列出同一本书,以显示该书中的所有作者 当然,我想要的是将一列中的所有作者列在一行中,一本书。
有人告诉我,这可以用游标来完成 但是,我无法想象如何使用它们 我不需要确切的代码,我只需要一些指导来解决这个问题。
另外,是否有更好的方法可以做到这一点,然后使用游标?
答案 0 :(得分:2)
FOR XML
是否正常将列放入逗号分隔列表:
How to get column values in one comma separated value
显然,它不必是逗号分隔它们,你可以把CHAR(13)或任何你需要的东西。
答案 1 :(得分:1)
这是一个完成的代码示例,您可以如何执行此操作(也可以使用其他人已经建议的内容)。这是你想要的吗?
-- declare variables
declare @ParamterCurrencyAmount numeric(26, 2),
@ParameterRollingVisitSum int
-- declare table variable
declare @Books table
(
ISBN int not null primary key,
BookName varchar(255) not null
)
-- declare table variable
declare @Authors table
(
AuthorID int primary key not null,
AuthorName varchar(255) not null
)
-- declare table variable
declare @BookAuthorRelations table
(
BookAuthorRelations int not null primary key,
ISBN int not null,
AuthorID int not null
)
-- insert sample data
insert into @Books
(
ISBN,
BookName
)
select 1000, 'Book A' union all
select 2000, 'Book B' union all
select 3000, 'Book C'
insert into @Authors
(
AuthorID,
AuthorName
)
select 1, 'Jack' union all
select 2, 'Peter' union all
select 3, 'Donald'
insert into @BookAuthorRelations
(
BookAuthorRelations,
ISBN,
AuthorID
)
select 1, 1000, 1 union all
select 2, 1000, 2 union all
select 3, 1000, 3 union all
select 4, 2000, 1 union all
select 5, 2000, 2 union all
select 6, 3000, 1
-- get books (with stuff)
select distinct Books.BookName,
stuff(
(
select distinct ', ' + Authors.AuthorName
from @Authors Authors,
@BookAuthorRelations BookAuthorRelations
where BookAuthorRelations.AuthorID = Authors.AuthorID
and Books.ISBN = BookAuthorRelations.ISBN
for xml path(''), type
).value('.', 'NVARCHAR(MAX)')
, 1, 2,'') data
from @Books Books
答案 2 :(得分:0)
如果您正在使用Oracle-DB,您可以使用LISTAGG - 这样的功能:
SELECT listagg(a.author_name, ',') WITHIN GROUP (ORDER BY b.isin) names
FROM books b
join book_authors ba on ba.bookId = b.bookId
join authors a on a.authorId = ba.authorid