我有3个表 Book Master ,类别Master ,子类别Master 。在我的 Book Master 表格中,列CategoryName
的值来自类别主的ID
列。 Book Master 中的SubcategoryName
列的子类别主中包含ID
列值。
3个表的表结构:
Book Master
Oid uniqueidentifier,
BookName nvarchar(100),
CategoryName uniqueidentifier,
SubCategoryName uniqueidentifier
类别大师
Oid uniqueidentifier,
CategoryName nvarchar(100)
子类别大师
Oid uniqueidentifier,
CategoryName uniqueidentifier,
SubCategoryName nvarchar(100)
我正在开发一个Windows应用程序,因为我必须显示每个类别的书中的前5本书。现在我在表中有10条记录,我使用以下查询在表单上显示书籍。
select BM.BookName ,BM.BookImage,CM.CategoryName,SCM.SubCategoryName
from BookMaster BM,CategoryMaster CM,SubCategoryMaster SCM
where BM.CategoryName=CM.Oid and BM.SubCategoryName=SCM.Oid
order by CM.CategoryName
这个查询给了我所有10条记录。但是,当表中的记录较少时,此查询很好。但是当记录不断增加时,很难显示所有记录。出于这个原因,我想展示每个类别的前5本书。
我已尝试使用group by子句
select top 5 BM.BookName ,BM.BookImage,CM.CategoryName,SCM.SubCategoryName
from BookMaster BM,CategoryMaster CM,SubCategoryMaster SCM
where BM.CategoryName=CM.Oid and BM.SubCategoryName=SCM.Oid
group by CM.CategoryName
但它给我错误说,
列'BookMaster.BookName'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
建议我解决此问题。 提前致谢
答案 0 :(得分:0)
编写一个带有CategoryName的函数,并将该类别的前5本书作为表返回 然后使用T SQL Apply打印您想要的结果
更多详情http://msdn.microsoft.com/en-us/library/ms175156%28v=sql.105%29.aspx
答案 1 :(得分:0)
试试这个:
WITH CategoryCTE AS (
SELECT
BookName,
ROW_NUMBER() OVER (
PARTITION BY CategoryName
ORDER BY CategoryName DESC
) AS CTE_Order
FROM BookMaster
)
SELECT bm.BookName, cm.CategoryName, scm.SubCategoryName
FROM
CategoryCTE
INNER JOIN BookMaster bm ON CategoryCTE.BookName = bm.BookName
INNER JOIN CategoryMaster cm ON bm.CategoryName = cm.Oid
INNER JOIN SubCategoryMaster scm ON bm.SubCategoryName = scm.Oid
WHERE CategoryCTE.CTE_Order < 6
GROUP BY cm.CategoryName, scm.SubCategoryName, bm.BookName
答案 2 :(得分:0)
请查看此链接以获取解决方案
http://sqlzoo.net/howto/source/z.dir/err979/sqlserver
在查询中使用group by子句时,您必须在group子句中的select query中指定所选列的列,否则显示错误您得到的内容