我有这种情况..
我想遍历一个表并将每一行作为参数传递给另一个过程
就像这样..
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
借用'借阅'列是借书的次数
我该怎么做?任何的想法?我很感激..
非常感谢你..
答案 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