لا تحتاج إلى حلقة ، ولكن سلسلة بسيطة من الأعداد الصحيحة التي يمكنك الانضمام إليها.
جدول الأعداد الصحيحة
في SQL ، أ جدول الأعداد الصحيحة غالبًا ما يستخدم لهذا الغرض. على سبيل المثال ،
CREATE TABLE UTIL$KILO (i INTEGER NOT NULL); -- one thousand integers, 0 – 999
INSERT INTO UTIL$KILO (i) VALUES (0);
INSERT INTO UTIL$KILO (i) VALUES (1);
...
INSERT INTO UTIL$KILO (i) VALUES (999);
سلسلتك صغيرة جدًا بحيث يمكنك جعل مثل هذه النتيجة محددة:
SELECT SUM(...),
i AS "MONTH"
FROM (SELECT 1 AS i --
UNION ALL -- We'll just enumerate the months here
SELECT 2 --
UNION ALL --
... --
SELECT 12) month_nos
CROSS JOIN StoreFlowsByDates(ib_encodedate(..., i, ...)...)
GROUP BY 2;
إجراءات توليد السلسلة
بعض وظائف إمدادات RDBMS لتوليد مثل هذه السلسلة ، و Firebird إجراء تخزين يمكن اختياره يمكن كتابتها لنفس التأثير:
-- UTIL$RANGE(start, stop, step)
--
-- Firebird selectable stored procedure for producing integer ranges.
-- (Public Domain)
--
CREATE EXCEPTION util$err_range_zero_step 'step size may not be zero';
SET TERM !!;
CREATE PROCEDURE util$range("Start" INTEGER, "Stop" INTEGER, "Step" INTEGER)
RETURNS (i INTEGER) AS
BEGIN
IF ("Step" > 0) THEN BEGIN
i = "Start";
WHILE (i <= "Stop") DO BEGIN
SUSPEND;
i = i + "Step";
END
END
ELSE IF ("Step" < 0) THEN BEGIN
i = "Start";
WHILE (i >= "Stop") DO
BEGIN
SUSPEND;
i = i + "Step";
END
END
ELSE IF ("Step" = 0) THEN
EXCEPTION util$err_range_zero_step;
-- ELSE return empty set
END !!
SET TERM ;!!
الاستعلام ثم يشبه هذا:
SELECT SUM(...),
i AS "MONTH"
FROM util$range(1, 12, 1)
CROSS JOIN StoreFlowsByDates(ib_encodedate(..., i, ...)...)
GROUP BY 2;