Логика SQL-запросов
У меня есть следующий набор данных
a b c `1` 2 3 3 6 9 9 2 11
Как видите, первое значение столбца a фиксировано (т. Е. 1), но из второй строки оно получает значение столбца c предыдущей записи.
Значения столбца b являются случайными, а значение столбца c рассчитывается как c = a + b.
Мне нужно написать SQL-запрос, который выберет эти данные в вышеуказанном формате. Я пытался писать, используя функцию задержки, но не смог достичь.
Пожалуйста помоги.
Изменить: столбец b
существует только в таблице, a and c
необходимо рассчитать на основе значений b
,
Hanumant
2 ответа
SQL> select a
2 , b
3 , c
4 from dual
5 model
6 dimension by (0 i)
7 measures (0 a, 0 b, 0 c)
8 rules iterate (5)
9 ( a[iteration_number] = nvl(c[iteration_number-1],1)
10 , b[iteration_number] = ceil(dbms_random.value(0,10))
11 , c[iteration_number] = a[iteration_number] + b[iteration_number]
12 )
13 order by i
14 /
A B C
---------- ---------- ----------
1 4 5
5 8 13
13 8 21
21 2 23
23 10 33
5 rows selected.
С Уважением,
Роб.
Не зная отношения между строками, как мы можем вычислить сумму предыдущей строки a and b
столбец к текущей строке a column
.Я создал еще два column id and parent
в таблице, чтобы найти связь между двумя строками.
parent
это столбец, который говорит нам о previous row
,а также id
это primary key
ряда.
create table test1 (a number ,b number ,c number ,id number ,parent number);
Insert into TEST1 (A, B, C, ID) Values (1, 2, 3, 1);
Insert into TEST1 (B, PARENT, ID) Values (6, 1, 2);
Insert into TEST1 (B, PARENT, ID) Values (4, 2, 3);
WITH recursive (a, b, c,rn) AS
(SELECT a,b,c,id rn
FROM test1
WHERE parent IS NULL
UNION ALL
SELECT (rec.a+ rec.b) a
,t1.b b
,(rec.a+ rec.b+t1.b) c
,t1.id rn
FROM recursive rec,test1 t1
WHERE t1.parent = rec.rn
)
SELECT a,b,c
FROM recursive;
WITH keyword
определяет имяrecursive
для подзапроса, который должен следоватьС рекурсивным (a, b, c,rn) AS
Далее идет первая часть именованного подзапроса
SELECT a,b,c,id rn FROM test1 WHERE parent IS NULL
Именованный подзапрос является UNION ALL
из двух запросов. Это, первый запрос, определяет отправную точку для рекурсии. Как и в моем запросе CONNECT BY, я хочу знать, с чего начать запись.
Далее следует та часть, которая была наиболее запутанной:
SELECT (rec.a+ rec.b) a
,t1.b b
,(rec.a+ rec.b+t1.b) c
,t1.id rn
FROM recursive rec,test1 t1
WHERE t1.parent = rec.rn
Вот как это работает:
Запрос WITH: 1. Родительский запрос выполняет:
SELECT a,b,c FROM recursive;
- Это запускает выполнение именованного подзапроса. 2 Первый запрос в объединении подзапроса выполняется, давая нам начальную строку, с которой начинается рекурсия:
SELECT a,b,c,id rn FROM test1 WHERE parent IS NULL
Начальная строка в этом случае будет для id =1, если родительский элемент равен нулю. Давайте теперь будем называть начальную строку "новыми результатами", новыми в том смысле, что мы еще не завершили их обработку.
Второй запрос в объединении подзапроса выполняет:
SELECT (rec.a+ rec.b) a ,t1.b b ,(rec.a+ rec.b+t1.b) c ,t1.id rn FROM recursive rec,test1 t1 WHERE t1.parent = rec.rn