SQL:填充B列,其中A列在B列的其他位置具有匹配项

SQL:填充B列,其中A列在B列的其他位置具有匹配项,sql,sql-server,tsql,Sql,Sql Server,Tsql,我是SQL查询的新手,尤其是任何包含逻辑的查询,尽管我已经搜索了几个小时,但在这种情况下,要找到要搜索的确切术语并不容易!我有一个相对简单的,我相信: 一个表有两列,每行包含程序中函数的数据。某些函数具有关联的父函数(用于分组)。A列是唯一的函数ID。B列在适用时表示父函数的ID。所有父函数ID都是独立且有效的函数ID,存在于A列的其他位置 出于报告目的,我需要列出按父ID分组的函数,列出父函数和子函数。我可以很容易地按父函数ID报告,但问题是父函数不知道它是父函数,因为它的B列是空的 我需要做

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

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

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

我需要做的是完成B列中的值,如果它是空的,并且函数在其他地方被引用为父函数

否则,对于B列中有空值的每一行

  • 从A列中获取值
  • 检查B列任何一行中是否存在该值
  • 如果存在匹配项,则将该值注入B列(以便a列和B列具有相同的值)
  • 我拥有的:(查询:
    选择函数id,从函数中选择父函数

    我需要的是:

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

    有什么想法吗?我迫不及待地想更熟悉SQL!提前感谢。

    这应该适合您:

    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)
    

    这应该适合您:

    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)
    

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

    也许您可以使用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/
    
    这个看起来怎么样

    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
    
    这个看起来怎么样

    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
    

    您真的想更新表中的值,还是只想显示在输出中?对不起,我以前没有看到这个。新的网站!不,我不想更新值,我只需要更新结果-我正在将它们拉入excel并使用数据透视图。@Beth如果你们中有人感兴趣,我有一个后续问题,您真的想更新表中的值,还是只想在输出中显示?抱歉,我以前没有看到这个。新的网站!不,我不想更新值,我只需要更新结果-我正在将它们拉入excel并使用数据透视图。@Beth如果你们有兴趣,我有一个后续问题是的,这很有效,简短,现在我已经学会了如何使用“as”-太好了!但是我不需要额外的列,PinnyM的解决方案正是我需要的!是的,这很有效,简洁明了,现在我学会了如何使用“as”-很棒!但是我不需要额外的列,PinnyM的解决方案正是我需要的!这太完美了!我将查找coalesce(如我所说,真的是一个初学者…)。这将允许我准备好我的报告,并且我将根据需要继续定制我的透视表。非常感谢。如果你感兴趣的话,我有一个建议。这太完美了!我将查找coalesce(如我所说,真的是一个初学者…)。这将允许我准备好我的报告,并且我将根据需要继续定制我的透视表。非常感谢。如果你感兴趣,我有一个非常有趣的工具。我可以看出这对我接下来的一些事情来说是多么方便!谢谢非常有趣的工具。我可以看出这对我接下来的一些事情来说是多么方便!谢谢