如何将多个表中的数据检索到单个表中

时间:2013-07-20 10:01:13

标签: sql-server

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

建议我解决此问题。 提前致谢

3 个答案:

答案 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中指定所选列的列,否则显示错误您得到的内容