如何循环SQL Server中的表的行数?

时间:2014-07-17 03:13:04

标签: sql-server

我有这种情况..

我想遍历一个表并将每一行作为参数传递给另一个过程

就像这样..

while ( select @myTitle=Title from tblBooks )
   select * from tblBorrowed where Title = @myTitle

这只是一个伪代码,它在sql中是一个错误..

如何在SQL Server中查看此类结果

tblBooks

ID     Title
------------
 1      A 
 2      B
 3      C
 4      D

tblBorrowed

ID     Title
------------
 1      A 
 2      A
 3      A
 4      D
 5      C
 6      C
 7      D

我想做出这样的结果

Title   Borrowed
------------
 A      3
 B      0
 C      2
 D      2

借用'借阅'列是借书的次数

我该怎么做?任何的想法?我很感激..

非常感谢你..

2 个答案:

答案 0 :(得分:0)

SQL实际上不是一种过程语言,您可以循环遍历行以获得结果。你可以这样做,但它真的很慢。

SQL中的大多数内容都可以在没有循环的情况下完成。看起来您只需要group by

从这样的事情开始:

select 
   Title,                -- Title field for the group
   count(*) as Borrowed  -- "Borrowed" is the number of rows in the group
from tblBorrowed
group by Title           -- groups are determined by looking at Title field

这使得SQL Server可以根据标题将结果拆分为组,如下所示:

ID     Title
------------
 1      A 
 2      A
 3      A

 4      D
 7      D

 5      C
 6      C

然后,对于每个组,它会计算行数 - count(*),并为每个组报告一行及其行数。

Title   Borrowed
------------
 A      3
 D      2
 C      2

请注意,您没有B,因为没有可计算的行。如果您确实需要B行,那么您必须使用join

select
   book.Title,
   borrow.ID
from tblBooks book
left join tblBorrowed borrow on borrow.Title=book.Title

现在开始使用tblBooks表(包括B)并尝试将每行匹配到一个或多个tblBorrowed行。如果没有tblBorrowed行,您仍然有一行tblBooks

你得到这样的东西:

Title  ID
---------
A      1
A      2
A      3
B      null
C      5
C      6
D      4
D      7

现在您可以对该查询进行分组并再次计算:

select
   book.Title,
   count(*)
from tblBooks book
left join tblBorrowed borrow on borrow.Title=book.Title
group by book.Title

它被分成几组:

Title  ID
---------
A      1
A      2
A      3

B      null

C      5
C      6

D      4
D      7

每个小组都被计算在内:

Title  ID
---------
A      3
B      0
C      2
D      2

答案 1 :(得分:0)

试试这个:

SELECT      TB.Title, COUNT(BO.ID) AS Borrowed
FROM        tblBooks AS TB LEFT OUTER JOIN
            tblBorrowed AS BO ON BO.Title = TB.Title
GROUP BY    TB.Title

COUNT()功能

中使用tblBorrowed

COUNT(BO.ID)返回 0 COUNT(*)返回 1