Есть ли способ добавить поле в родительский запрос, которое будет увеличиваться по мере того, как запрос проходит через все значения, сгенерированные в подзапросе?
Я думаю, что у меня есть таблица, в которой отсутствует настоящий первичный ключ, и мне нужно создать его на выходе. Я не могу изменить таблицу.
Мне нужно запустить запрос выбора, чтобы сгенерировать список значений (list_A), затем взять эти значения и запросить их, чтобы показать все записи, связанные с ними. Из этих записей я делаю еще один выбор, чтобы извлечь теперь видимый список с именем list_B. В списке list_B я могу выполнить поиск по ним, чтобы выявить все записи, относящиеся к исходному списку (list_A), причем во многих из этих записей отсутствуют значения из list_A, но их все еще необходимо подсчитать.
Вот мой процесс:
- Я объявил последовательность под названием temp_key, которая начинается с 1 и увеличивается на 1.
- Я добавляю поле под названием temp_key к родительскому запросу, чтобы он, надеюсь, показал, к какому элементу исходного подзапроса list_A относятся полученные записи.
- У меня проблемы, потому что я не знаю, как увеличить 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, какие ключи вы хотите выбрать.