所以,我有以下问题:
我有4个表:范围信息,范围百分比,DGRange和SGRange
范围信息的范围百分比为1 - N(IE:N百分比至1范围)
DGRange和SGRange都将这两个表连接到其他外部字体。
不应该那样。但这就是系统构建的方式,现在我只能修复那个愚蠢决定中出现的问题。
在任何情况下,我们都发现DGRange和SGRange在它们不应该指向同一主键的时候 - 因此,一旦系统更改了该范围内的任何信息,它就会搞砸系统中的其他内容。因此,我必须每次都找到这些副本(非常容易做到)并在RangeInformation / RangePercentage上复制整个记录并将其中一个指向新记录。
我的问题是,现在我正在考虑在游标中使用游标,我相信可能有一种更简单的方法。
有更好的方法吗?
DECLARE @range nvarchar(10)
DECLARE @rangeinfoid nvarchar(10)
DECLARE @lowerlimit money
DECLARE @Upperlimit money
DECLARE @CurrentYear smallint
DECLARE @Percentage float
DECLARE subgroup_cursor CURSOR FOR
SELECT distinct a.RangeInformationId
FROM SubgroupRange a, DiscountGroupRange b
where a.RangeInformationId = b.RangeInformationId
DECLARE rangeperc_cursor CURSOR FOR
SELECT CurrentYear,
Percentage
from RangePercentage
where RangeInformationId = @range
OPEN subgroup_cursor
FETCH NEXT FROM subgroup_cursor INTO @range
WHILE @@FETCH_STATUS = 0
BEGIN
select @rangeinfoid = RangeInformationId ,
@lowerlimit = LowerLimit,
@Upperlimit = UpperLimit
from RangeInformation
where RangeInformationId = @range
--Add insert here
OPEN rangeperc_cursor
FETCH NEXT FROM subgroup_cursor INTO @CurrentYear, @Percentage
WHILE @@FETCH_STATUS = 0
BEGIN
print(@CurrentYear)
print(@Percentage)
--Add insert here
FETCH NEXT FROM rangeperc_cursor INTO @CurrentYear, @Percentage
END
FETCH NEXT FROM subgroup_cursor INTO @range
END
CLOSE subgroup_cursor
DEALLOCATE subgroup_cursor
CLOSE rangeperc_cursor
DEALLOCATE rangeperc_cursor
答案 0 :(得分:0)
正如我在上面评论的那样,很难确切地知道你想要做什么,但这样做会得到你需要的数据吗?
select ri.RangeInformationId
, ri.LowerLimit
, ri.UpperLimit
from RangeInformation ri
join SubgroupRange sr on sr.RangeInformationId = ri.RangeInformationId
join DiscountGroupRange dgr on dgr.RangeInformationId = sr.RangeInformationId
你真的应该养成这种加入方式的习惯。这是一个更清晰的代码,通过忘记连接谓词作为where子句来帮助防止意外的交叉连接。
答案 1 :(得分:0)
为清楚起见,这是我留下的评论的一个例子。
基本上,尝试通过在临时表中创建相同的填充来完全删除subgroup_cursor
:
DECLARE @rangeinfoid int
DECLARE @CurrentYear smallint
DECLARE @Percentage float
CREATE TABLE #temp_subgroup
(
RangeInformationID int
)
INSERT INTO #temp_subgroup
(RangeInformationID)
SELECT distinct a.RangeInformationId
FROM SubgroupRange a, DiscountGroupRange b
where a.RangeInformationId = b.RangeInformationId
DECLARE rangeperc_cursor CURSOR FOR
SELECT CurrentYear,
Percentage,
RangeInformationID
from RangePercentage
where RangeInformationId IN (SELECT RangeInformationID FROM #temp_subgroup)
OPEN rangeperc_cursor
WHILE (@@FETCH_STATUS <> 0)
BEGIN
FETCH NEXT FROM rangeperc_cursor INTO @rangeinfoid, @CurrentYear, @Percentage
CREATE TABLE #temp_rangeupdate
(
RangeInformationID int,
LowerLimit money,
UpperLimit money
)
INSERT INTO #temp_rangeupdate
( RangeInformationID, LowerLimit, UpperLimit)
SELECT RangeInformationID,
LowerLimit,
UpperLimit
FROM RangeInformation
WHERE RangeInformationID = @rangeinfoid
-- UPDATE/INSERT #temp_rangeupdate
-- UPDATE/INSERT Production Tables from #temp_rangeupdate
DROP TABLE #temp_rangeupdate
END
DROP TABLE #temp_subgroup
CLOSE rangeperc_cursor
DEALLOCATE rangeperc_cursor