Есть ли способ добавить поле в родительский запрос, которое будет увеличиваться по мере того, как запрос проходит через все значения, сгенерированные в подзапросе?

Я думаю, что у меня есть таблица, в которой отсутствует настоящий первичный ключ, и мне нужно создать его на выходе. Я не могу изменить таблицу.

Мне нужно запустить запрос выбора, чтобы сгенерировать список значений (list_A), затем взять эти значения и запросить их, чтобы показать все записи, связанные с ними. Из этих записей я делаю еще один выбор, чтобы извлечь теперь видимый список с именем list_B. В списке list_B я могу выполнить поиск по ним, чтобы выявить все записи, относящиеся к исходному списку (list_A), причем во многих из этих записей отсутствуют значения из list_A, но их все еще необходимо подсчитать.

Вот мой процесс:

  1. Я объявил последовательность под названием temp_key, которая начинается с 1 и увеличивается на 1.
  2. Я добавляю поле под названием temp_key к родительскому запросу, чтобы он, надеюсь, показал, к какому элементу исходного подзапроса list_A относятся полученные записи.
  3. У меня проблемы, потому что я не знаю, как увеличить temp_key, когда подзапрос list_A перемещается от начала до конца всех значений в списке.
      SELECT currval(temp_key) AS temp_key, list_A, list_B 
FROM table 
WHERE list_B IN (SELECT DISTINCT list_B 
                 FROM table 
                 WHERE list_A IN (SELECT DISTINCT list_A 
                                  from table);

На данный момент вышеуказанный запрос не работает, потому что, похоже, нет способа заставить текущее значение temp_key увеличиваться вверх, поскольку оно проходит через значения из списка, изначально созданного из подзапроса самого низкого уровня (list_A).

Например, в list_A может быть только 10 значений. И на выходе может быть 100 записей, все с номерами от 1 до 10, причем многие из этих значений пропускают значения в поле list_A. Но они все равно должны быть помечены от 1 до 10, потому что значения list_B соединяют два набора.

1 ответ

Возможно, вы можете сначала создать новый столбец первичного ключа с помощью следующего кода (объединяя номер строки с list_a):

      WITH T AS (
        SELECT currval(temp_key) AS temp_key, list_A, list_B, 

        CONCAT(ROW_NUMBER() OVER(PARTITION BY list_A ORDER BY list_B),list_A) AS Prim_Key  
        FROM table )

SELECT * fROM T

Затем вы можете указать в предложении where, какие ключи вы хотите выбрать.

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