Логика 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;

выход

  1. WITH keyword определяет имя recursive для подзапроса, который должен следовать

    С рекурсивным (a, b, c,rn) AS

  2. Далее идет первая часть именованного подзапроса

    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

Другие вопросы по тегам