SQL:填充列B,其中列A与列B中的其他位置匹配

时间:2012-12-10 16:47:48

标签: sql sql-server tsql

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

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

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

我需要做的是完成B列中的值,如果它是空的,并且该函数在别处作为父函数引用。

否则说明,B列中具有空值的每行

  1. 从A列中取值
  2. 检查B列
  3. 中任何一行是否存在该值
  4. 如果匹配,请将值注入B列(以便A列和B列具有相同的值)
  5. 我有什么:(查询: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!提前谢谢。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

也许您可以使用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/

答案 2 :(得分:0)

这看起来怎么样?

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