我的三个表是这么样的....
书表 books (bk_id,bk_title,bk_price,bk_publishing)
作者表 authors(au_id,au_name)
书和作者中间表 books_authors(ID,bk_id,au_id)
按下面的代码查询书的书名,价格,出版社,作者名字这些信息。因为有一本书多个作者的情况,如果查的话那就一条信息变成两条信息了。只选前几条给看一下.
SELECT bk.bk_id,bk.bk_title,bk.bk_price,bk.bk_publishing,au.au_name
FROM dbo.Books bk INNER JOIN books_authors ba ON bk.bk_id=ba.bk_id
INNER JOIN dbo.authors au ON ba.au_id = au.au_idbk_id bk_title bk_price bk_publishing au_name
1 数据库 50.00 铁道出版 曾伟
1 数据库 50.00 铁道出版 刘城
2 语文 40.00 人民出版社 人民
3 倚天屠龙记 43.00 人民出版社 金庸
3 倚天屠龙记 43.00 人民出版社 张无忌我想来想去也就应该字符串拼接了,不过不知道怎么拼了。 求代码....
虽然说别人说可以在前台的客户端比较容易弄,但求在SQL里怎么解决。 求代码....
书表 books (bk_id,bk_title,bk_price,bk_publishing)
作者表 authors(au_id,au_name)
书和作者中间表 books_authors(ID,bk_id,au_id)
按下面的代码查询书的书名,价格,出版社,作者名字这些信息。因为有一本书多个作者的情况,如果查的话那就一条信息变成两条信息了。只选前几条给看一下.
SELECT bk.bk_id,bk.bk_title,bk.bk_price,bk.bk_publishing,au.au_name
FROM dbo.Books bk INNER JOIN books_authors ba ON bk.bk_id=ba.bk_id
INNER JOIN dbo.authors au ON ba.au_id = au.au_idbk_id bk_title bk_price bk_publishing au_name
1 数据库 50.00 铁道出版 曾伟
1 数据库 50.00 铁道出版 刘城
2 语文 40.00 人民出版社 人民
3 倚天屠龙记 43.00 人民出版社 金庸
3 倚天屠龙记 43.00 人民出版社 张无忌我想来想去也就应该字符串拼接了,不过不知道怎么拼了。 求代码....
虽然说别人说可以在前台的客户端比较容易弄,但求在SQL里怎么解决。 求代码....
-- Author :DBA_Huangzj(發糞塗牆)
-- Date :2013-11-05 15:57:58
-- Version:
-- Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64)
-- Dec 28 2012 20:23:12
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
--
----------------------------------------------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go
create table [huang]([bk_id] int,[bk_title] varchar(10),[bk_price] numeric(4,2),[bk_publishing] varchar(10),[au_name] varchar(6))
insert [huang]
select 1,'数据库',50.00,'铁道出版','曾伟' union all
select 1,'数据库',50.00,'铁道出版','刘城' union all
select 2,'语文',40.00,'人民出版社','人民' union all
select 3,'倚天屠龙记',43.00,'人民出版社','金庸' union all
select 3,'倚天屠龙记',43.00,'人民出版社','张无忌'
--------------开始查询--------------------------
select a.[bk_id],a.[bk_title],a.[bk_price],a.[bk_publishing],
stuff((select ','+au_name from [huang] b
where b.[bk_id]=a.[bk_id] and b.[bk_title]=a.[bk_title] AND a.[bk_price]=b.[bk_price] AND a.[bk_publishing]=b.[bk_publishing]
for xml path('')),1,1,'') 'au_name'
from [huang] a
group by a.[bk_id],a.[bk_title],a.[bk_price],a.[bk_publishing]
----------------结果----------------------------
/*
bk_id bk_title bk_price bk_publishing au_name
----------- ---------- --------------------------------------- ------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 数据库 50.00 铁道出版 曾伟,刘城
2 语文 40.00 人民出版社 人民
3 倚天屠龙记 43.00 人民出版社 金庸,张无忌
*/
WITH huang
AS ( SELECT bk.bk_id ,
bk.bk_title ,
bk.bk_price ,
bk.bk_publishing ,
au.au_name
FROM dbo.Books bk
INNER JOIN books_authors ba ON bk.bk_id = ba.bk_id
INNER JOIN dbo.authors au ON ba.au_id = au.au_id
)
SELECT a.[bk_id] ,
a.[bk_title] ,
a.[bk_price] ,
a.[bk_publishing] ,
STUFF(( SELECT ',' + au_name
FROM [huang] b
WHERE b.[bk_id] = a.[bk_id]
AND b.[bk_title] = a.[bk_title]
AND a.[bk_price] = b.[bk_price]
AND a.[bk_publishing] = b.[bk_publishing]
FOR
XML PATH('')
), 1, 1, '') 'au_name'
FROM [huang] a
GROUP BY a.[bk_id] ,
a.[bk_title] ,
a.[bk_price] ,
a.[bk_publishing]
bk.bk_id,bk.bk_title,
bk.bk_price,bk.bk_publishing,
stuff(
(
select ','+ a1.au_name from dbo.authors a1
where a1.au_id = au.au_id
for xml path('')
),
1,1,''
) as au_nae
FROM dbo.Books bk
INNER JOIN books_authors ba
ON bk.bk_id=ba.bk_id
INNER JOIN dbo.authors au
ON ba.au_id = au.au_id