0

我想我有一个缺少真正主键的表,我需要在输出中创建一个。我无法修改表格。

我需要运行一个选择查询来生成一个值列表(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 的值连接了这两个集合。

4

1 回答 1

0

也许您可以先使用以下代码创建一个新的主键列(将行号与 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 子句中指定要选择的键

于 2021-02-10T07:09:52.897 回答