Sql sybase while循环辅助
我对SQL和Sybase有基本的了解,这是我第一次尝试循环一些东西。我在这里尝试了几个建议,并总结了以下内容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
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