【问题标题】:SQL: Populating Column B where Column A has a match elsewhere in Column BSQL:填充 B 列,其中 A 列在 B 列的其他地方有匹配项
【发布时间】:2012-12-10 16:47:47
【问题描述】:

我是 SQL 查询的新手,尤其是任何包含逻辑的查询,虽然我已经搜索了几个小时,但在这种情况下找到要搜索的确切术语并不容易!我有一个相对简单的,我敢肯定:

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

出于报告目的,我需要列出按父 ID 分组的函数,列出父函数和子函数。我可以很容易地通过父函数ID进行报告,但问题是父函数不知道它是父函数,因为它的B列是空的!

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

另外说明,对于在 B 列中具有空值的每一行

  1. 从 A 列取值
  2. 检查 B 列任意行中是否存在该值
  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!提前谢谢。

【问题讨论】:

  • 您真的要更新表中的值,还是只显示在输出中?
  • 对不起,我以前没有看到这个。网站新手!不,我不想更新值,我只需要更新结果 - 我将它们拉入 excel 并使用数据透视图。
  • @Beth 如果你们有兴趣,我有一个后续问题link

标签: sql sql-server tsql


【解决方案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)

【讨论】:

  • 这太完美了!我要去看看coalesce(就像我说的,真的是一个初学者......)。这将使我能够准备好我的报告,并且我将根据需要继续自定义我的数据透视表。谢谢!
  • 如果你有兴趣,我有一个follow-up question
【解决方案2】:

也许您可以使用 EXCEPT 或 INTERSECT 比较这两个表

http://msdn.microsoft.com/en-us/library/ms188055.aspx

更多教程>:

 http://www.mssqltips.com/sqlservertip/1327/compare-sql-server-datasets-with-intersect-and-except/

【讨论】:

  • 确实是非常有趣的工具。我可以看到这对于我即将提出的一些事情是多么方便!谢谢!
【解决方案3】:

这看起来怎么样?

select distinct
t1.funx, t1.parent,
case when t2.parent is null then t1.parent
else t2.parent end as newparent
from 
tbl t1 left outer join
tbl t2 on 
t1.funx = t2.parent

sqlFiddle

【讨论】:

  • 是的,这行得通,简洁明了,现在我已经学会了如何使用“as”——太棒了!不过我不需要额外的专栏,PinnyM 的解决方案正是我所需要的!
猜你喜欢
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 2013-05-24
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多