0

我有 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.

所以请建议我做正确的查询............?????

4

2 回答 2

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'
于 2012-12-21T08:23:53.323 回答
0

您的子查询返回多个值的原因是它与正在更新的行不相关。试试下面的 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 的答案看起来可能更有效。但是,希望这有助于解释您的原始语法在哪里出错。

于 2012-12-21T08:35:30.993 回答