我认为我有一个表缺乏真正的主键,我需要在输出中创建一个。我不能修改这个表。
我需要运行一个选择查询来生成一个值列表(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的值连接了这两个集合。
也许您可以先用下面的代码创建一个新的主键列(将行号与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子句中指定你想选择的键