Sql sybase while循环辅助

Sql sybase while循环辅助,sql,loops,sybase,Sql,Loops,Sybase,我对SQL和Sybase有基本的了解,这是我第一次尝试循环一些东西。我在这里尝试了几个建议,并总结了以下内容 DECLARE @district varchar(2), @numSchools int, @sc_cd varchar(2) SELECT @district = 'MS', @numSchools = 1 SET rowcount 0 SELECT supv_clas_cd INTO #MyTemp FROM t_supv_class WHERE ef

我对SQL和Sybase有基本的了解,这是我第一次尝试循环一些东西。我在这里尝试了几个建议,并总结了以下内容

 DECLARE @district varchar(2), @numSchools int, @sc_cd varchar(2)
 SELECT @district = 'MS', @numSchools = 1

 SET rowcount 0
 SELECT supv_clas_cd INTO #MyTemp
     FROM t_supv_class
     WHERE eff_dt IS NULL

 DECLARE @rowsaf INT
 SELECT @rowsaf = @@rowcount FROM #MyTemp

 WHILE @rowsaf > 1
 BEGIN
     SET rowcount 1
     SELECT @sc_cd = supv_clas_cd FROM #MyTemp
     SET rowcount 0
     DELETE #MyTemp WHERE @sc_cd = supv_clas_cd
     SELECT @rowsaf = @@rowcount FROM #MyTemp

     SELECT TOP @numSchools
         s.nm_tx AS 'School Name', @sc_cd AS 'Supv Class'
        FROM t_Schools s
        LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
        WHERE supv_clas_cd = @sc_cd
        AND s.csrv_cd = @district
 END 
 SET rowcount 0
我试图做的是避免出现大量只有supv_clas_cd更改的联合。 基本上,为每个给定的supv_类返回一组学校名称,这些名称可以随着表的编辑而更改

temp表MyTemp中平均有40行。 并非所有supv_clas_cd和crsv_cd的组合都有价值,但TRY/CATCH似乎并不希望如此

有人能帮我让这个循环工作吗?或者告诉我我做错了什么

或者只是硬编码所有的supv_clas_cd,并将结果合并到一个更好的解决方案中,而不是尝试循环所有这些

我最初的想法是 声明@district varchar2,@numSchools int 选择@district='MS',@numSchools=1

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'CC'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'CH'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'CO'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'CT'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'DA'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'DB'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'DI'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'DJ'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'DM'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'DS'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'DV'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'FB'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'FO'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'LC'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'LH'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'LL'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'LN'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'LT'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'MC'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'MH'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'ML'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'MN'
    AND s.csrv_cd = @district

UNION

SELECT TOP @numSchools
    s.nm_tx
    FROM t_Schools s
    LEFT OUTER JOIN t_supv_class sc ON sc.supv_clas_cd = s.supv_clas_cd
    WHERE supv_clas_cd = 'MT'
    AND s.csrv_cd = @district
这假设supv_clas_cd的位置不变,如果需要更改SELECT语句,则必须在每个位置执行

数据的样本看起来像

从这个样本中,我想要

我在考虑循环,以便集中SELECT语句进行维护和重用,并且不硬编码t_supv_clas.supv_clas_cd的所有值


作为记录,我只能以只读方式访问数据库,因此我无法创建一个与我的想法不同的过程。

试试这个,我不确定你希望看到Bambleweeny,也许我误解了什么,但Bambleweeny与supv_class_cd DB有关联,就像Acidlog一样

为了获得结果并允许@numSchools影响每个supv_class_cd返回的行数,我需要创建一个密集的排名。我相信在Oracle和SQL Server中 有这样一个关键字,但在Sybase ASE中没有,所以这里是伪造的:

t_supv_class|t_Schools
supv_clas_cd|nm_tx supv_clas_cd CC |Acidlog DB CH |Alexander FB CO |Amazing CT CT |Arthur FB DA |Babel CT DB |Babica FB DI |Bambleweeny DB DJ |Bang CH DM |Beeblebrox CT DS |Beneath CH DV |Betelgeuse DB FB |Blagulon CT FO |Blaster CH LC |Both DB LH |Brain CH LL |Bugblatter CH LN |By CH LT |Clare DB MC |Cos CH MH |Could CH ML |Damogran CT MN |Dark DB MT |Deep CH count*统计小于当前行并与合并外部表MyTemp中的supv_class_cd列匹配的行数。在这种情况下,密集列位于nm_tx列之上

MyTemp中的supv_class_cd值集使用联接进行迭代,这将替换原始问题中的循环

Acidlog Alexander Amazing Bambleweeny Bang 最后还有问题的原始部分需要添加

与t_supv_类的外部联接,这只是指定的 每个supv_class_cd的行数限制 创建MyTemp,再次指定 参数的声明和设置


我希望这能及时找到您,或者至少能为您提供一些帮助。

我发现以下语句出现两次有点奇怪:

    select
            s.nm_tx,
            s.supv_class_cd,
            (
                select
                        count(*) as row_id
                    from
                        t_schools s1
                    where
                        s.nm_tx >= s1.nm_tx
                    and s1.supv_class_cd = t.supv_class_cd
            ) as row_id
        from
            t_schools s,
            #MyTemp t
        where
            s.supv_class_cd = t.supv_class_cd
我将使用:

declare
    @numSchools int,
    @district char(2)

select
    @numSchools = 1,
    @district = 'MS'

select distinct 
        supv_class_cd
    into #MyTemp
    from t_supv_class
    where
        eff_dt is null

select
        x.nm_tx as School_name,
        x.supv_class_cd as Supv_class        
    from
    (
        select
                s.nm_tx,
                s.supv_class_cd,
                (
                    select
                            count(*) as row_id
                        from
                            t_schools s1
                        where
                            s.nm_tx >= s1.nm_tx
                        and s1.supv_class_cd = t.supv_class_cd
                ) as row_id
            from
                t_schools s,
                #MyTemp t
            where
                s.supv_class_cd = t.supv_class_cd
    ) x
    left outer join t_supv_class sc on sc.supv_class_cd = x.supv_class_cd
    where
        x.row_id <= @numSchools
go
@@rowcount是一个系统变量,用于存储受最新可执行命令影响的记录数。它与表中的行数无关。
看看这是否能让你更接近期望的结果。绝对不建议使用每个代码值1个sql的UNION语句。

sql在循环中运行得不太好。我可以给你一个最好的例子……你想开10英里,所以你想坐上汽车,一次就开完。SQL中的循环相当于每50英尺停车一次,从头开始重建汽车。您希望尽可能接近一条语句来完成所有操作。在继续这条路线之前,您应该问问自己,您是否可以在没有循环的情况下实现这些结果?很难从这里的内容来区分,但如果您提供一些示例数据和所需结果的示例,我相信我们可以为您找到一个无lopples sql解决方案。
declare
    @numSchools int,
    @district char(2)

select
    @numSchools = 1,
    @district = 'MS'

select distinct 
        supv_class_cd
    into #MyTemp
    from t_supv_class
    where
        eff_dt is null

select
        x.nm_tx as School_name,
        x.supv_class_cd as Supv_class        
    from
    (
        select
                s.nm_tx,
                s.supv_class_cd,
                (
                    select
                            count(*) as row_id
                        from
                            t_schools s1
                        where
                            s.nm_tx >= s1.nm_tx
                        and s1.supv_class_cd = t.supv_class_cd
                ) as row_id
            from
                t_schools s,
                #MyTemp t
            where
                s.supv_class_cd = t.supv_class_cd
    ) x
    left outer join t_supv_class sc on sc.supv_class_cd = x.supv_class_cd
    where
        x.row_id <= @numSchools
go
SELECT @rowsaf = @@rowcount FROM #MyTemp
SELECT @rowsaf = count(*) FROM #MyTemp