【问题标题】:sql server 2005 ----- how to update multiple rows using subquery [closed]sql server 2005 -----如何使用子查询更新多行[关闭]
【发布时间】:2012-12-21 08:17:50
【问题描述】:

我有 2 个表,分别命名为 member 和 tree_str...

“会员”表如下

self_id parent_id   position    
100     ROOT        ROOT    
101     100         LEFT    
102     100         CENTRE  
103     100         RIGHT   
104     101         LEFT    
105     101         CENTRE  
106     101         RIGHT   

“tree_str”表如下......

self_id  L1_Left     L1_center   L1_Right  
100     
101     
102     
103     
104     
105     
106

现在我想像这样使用第一个表填充第二个表.....

self_id  L1_Left     L1_center   L1_Right  
100    101             102         103  
101    104             105         106  
102     
103     
104     
105     
106 

....... 我使用查询............

update tree_str 
    set tree_str.L1_Left = (select member.self_id from tree_str 
    INNER JOIN member 
    on member.parent_id=tree_str.self_id 
    AND member.position='LEFT')
    WHERE self_id IN (select member.parent_id from tree_str INNER JOIN member 
    on member.parent_id=tree_str.self_id and member.position='LEFT') 

但它给出了结果.......

Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery 
follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.

所以请建议我正确的查询来做到这一点...........?????

【问题讨论】:

    标签: sql sql-server-2005 dml


    【解决方案1】:

    为什么不试试类似的东西

    UPDATE  tree_str
    SET     L1_Left = ml.self_id,
            L1_center = mc.self_id,
            L1_right = mr.self_id
    FROM    tree_str t LEFT JOIN
            member ml   ON  t.self_id = ml.parent_id
                        AND ml.position = 'LEFT' LEFT JOIN
            member mc   ON  t.self_id = mc.parent_id
                        AND mc.position = 'CENTRE' LEFT JOIN
            member mr   ON  t.self_id = mr.parent_id
                        AND mr.position = 'RIGHT'
    

    【讨论】:

    • 非常感谢先生,非常感谢您
    • 现在请告诉我,如何在触发器中使用此查询,当 self_id 列被下一条记录填充时会自动触发????
    【解决方案2】:

    您的子查询返回多个值的原因是它与正在更新的行不相关。试试下面的 SQL。

    update ts
     set ts.L1_Left =
      (select m.self_id
       FROM member m
         WHERE m.parent_id = ts.self_id
         AND m.position='LEFT')
    FROM tree_str ts
    WHERE self_id IN
      (select member.parent_id
       from tree_str
       INNER JOIN member
          on member.parent_id=tree_str.self_id
         and member.position='LEFT')
    

    请注意,相关子查询可能很昂贵,因此 Astander 的答案看起来可能更有效。但是希望这有助于解释您的原始语法哪里出了问题。

    【讨论】:

    • 感谢先生,它确实有效......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2013-01-15
    • 2019-09-05
    • 2012-02-21
    • 2019-05-24
    相关资源
    最近更新 更多