0

我有 3 张表Book MasterCategory MasterSubcategory Master。在我的Book Master表中,列CategoryName的值来自Category MasterID列。Book Master中的SubcategoryName列具有来自Subcategory Master的列值。ID

3张表的表结构:

书主

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 子句中。

建议我为此提供任何解决方案。提前致谢

4

3 回答 3

0

请查看此链接以获取解决方案

http://sqlzoo.net/howto/source/z.dir/err979/sqlserver

在查询中使用 group by 子句时,您必须在 group 子句中的 select 查询中指定选定的列列表,否则它会显示错误,您会得到什么

于 2013-07-21T04:46:40.680 回答
0

编写一个函数,接受 CategoryName 并将该类别的前 5 本书作为表返回然后使用 T SQL Apply 打印您想要的结果

更多详细信息 http://msdn.microsoft.com/en-us/library/ms175156%28v=sql.105%29.aspx

于 2013-07-20T10:28:44.227 回答
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
于 2013-07-20T10:47:55.620 回答