【问题标题】:How to use for loop scenario in sql server如何在sql server中使用for循环场景
【发布时间】:2012-08-09 07:50:00
【问题描述】:

我从查询中获得了多个值。

select l_t_id from MLTalukDetails join MLDistrictDetails on MLTalukDetails.L_D_Id=4

它返回 13,14,15,16。现在我想一次获取这些值中的每一个,并从这些值中获取详细信息,即

select Sc_Id from MSchoolDetails 
where 
MSchoolDetails.L_T_Id=@talukid and 
MSchoolDetails.Y_Id=@yearid

这种情况我能做什么。如何在这里使用 for 循环语法?

【问题讨论】:

  • 你可以使用pl/sql,它会提供循环和调节
  • 如果您可以简单地使用单个连接查询,为什么还需要“for 循环”?但鉴于此,如果您必须使用 CURSOR,您可能更愿意考虑使用!!!msdn.microsoft.com/en-us/library/ms180169(v=sql.105).aspx
  • 可以使用游标,但听起来您实际上仍在寻找某种集合操作/连接。如果你有一个处理返回的行,你会在你的应用中循环遍历结果。
  • 可能你正在寻找Correlated Subqueries

标签: sql sql-server loops


【解决方案1】:

我从您的问题推断这是您真正正在寻找的完整解决方案:

    SELECT MSchoolDetails.* 
      FROM MLTalukDetails
INNER JOIN MSchoolDetails ON MTalukDetails.l_t_id = MSchoolDetails.L_T_Id
     WHERE MLTalukDetails.L_D_ID = 4 AND MSchoolDetails.Y_Id=@yearid

通常一个有一个涉及两个表的连接条件。

我建议reading up 进行各种连接。

【讨论】:

  • 非常感谢。我的问题是,我必须显示每所学校的学生人数。我得到的输入是地区代码,所以我会得到地区 ID,即 MLTalukDetails.L_D_ID。从你的代码我可以得到学区的所有学校。现在我怎么能算每所学校没有学生。学校和学生之间的关系是 sc_id。我是这里的新手,所以请帮帮我。
  • 通过下面的代码我可以得到学区通过的学生人数。选择 COUNT(Md_Id) as noofpassed from MMarksDetails join MStudentDetails on MMarksDetails.St_Reg=MStudentDetails.St_Reg join MSchoolDetails on MStudentDetails.Sc_Id=MSchoolDetails.Sc_Id join MLTalukDetails on MLTalukDetails.L_T_Id=MSchoolDetails.L_T_Id join MLDistrictDetails on MLDistrictDetails.L_D_Id MLDistrictDetails.L_D_Id=4 和 MMarksDetails.Y_Id=7 和 MMarksDetails.Result='p';像这样我需要整个地区。
  • 这是您用来完成此任务的结构类型:SELECT school_id, COUNT(student_id) FROM ... WHERE ... GROUP BY school_id
【解决方案2】:

如果你想使用循环,请使用光标......这是我在存储过程中实现的解决方法......

CREATE PROCEDURE [dbo].[proc_GetSc_Id]
@yearid INT
AS
CREATE TABLE #Sc_Id(Sc_Id varchar(20))
BEGIN       
DECLARE @talukid varchar(20)

    declare c cursor For 
    select l_t_id from MLTalukDetails join MLDistrictDetails on MLTalukDetails.L_D_Id=4

open c
    fetch next from c into @talukid
    while(@@FETCH_STATUS=0)
    BEGIN
        insert into #Sc_Id(Sc_Id) 
            select Sc_Id from MSchoolDetails where MSchoolDetails.L_T_Id=@talukid and MSchoolDetails.Y_Id=@yearid
        fetch next from c into @talukid
    END
    select * from  #Sc_Id;---Here you got your final result.
close c
deallocate c
DROP TABLE #Sc_Id
END

【讨论】:

  • 这不是一个不正确的答案,就其本身而言,我只是认为用明显的XY Problem 直接回答一个基本问题并同时引入完全不相关的概念(存储过程)并用没有任何解释。
  • @mootinator :感谢您的评论.....我认为OP希望在其解决方案中实现循环机制......所以,我提供了上述解决方法,尽管还有其他有效的解决方案...... .关于存储过程,我认为这是使用sql server的好方法......
猜你喜欢
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 2014-06-23
相关资源
最近更新 更多