一尘不染

SQL:填充B列,其中A列与B列中的其他地方匹配

sql

我有点像SQL查询的新手,特别是任何包含逻辑的东西,尽管在这种情况下我已经花了数小时的时间来寻找精确的搜索词,却并不容易!我确定一个相对简单的人:

一个表有2列,每行包含有关程序中函数的数据。某些功能具有关联的父功能(用于分组)。列A是唯一功能ID。如果适用,列B指示父函数的ID。所有父功能ID是独立有效的功能ID,它们存在于A列的其他位置。

为了进行报告,我需要列出按其父ID分组的功能,并列出带有子功能的父功能。我可以通过父函数ID轻松报告,但问题是父函数不知道它是父函数,因为其列B为空!

我需要做的是完成B列中的值(如果为空)并且该函数在其他地方作为父函数引用。

除非另有说明,否则 对于 B 中具有空值的 每一行

  1. 从A列中获取值
  2. 检查B列的ANY行中是否存在该值
  3. 如果存在匹配项,则将该值注入到B列中(以使A和B列具有相同的值)

我有什么:(查询:SELECT function_id, parent_function FROM functions

FUNCTION_ID   PARENT_FUNCTION   
4  
13            4  
79  
138           4
195
314           345
345

我需要具备的条件:

FUNCTION_ID   PARENT_FUNCTION
4             4
13            4
79
138           4
195
314           345
345           345

有任何想法吗?我迫不及待想要更熟悉SQL!提前谢谢。


阅读 116

收藏
2021-05-16

共1个答案

一尘不染

这应该为您工作:

UPDATE functions
SET parent_function = function_id
WHERE parent_function IS NULL
AND function_id IN (SELECT parent_function FROM functions)

它将设置为parent_function等于function_id尚未设置的位置,以及它在parent_function列中某处出现的位置。

如果您实际上不想修改表数据,但仍返回所需的值,则可以使用类似的逻辑,例如:

SELECT f.function_id, COALESCE(f.parent_function, f2.function_id) as parent_function
FROM functions f
LEFT JOIN functions f2
  ON f.function_id = f2.function_id
  AND f2.function_id IN (SELECT parent_function FROM functions)
2021-05-16