SQL子查询在复制数据中返回多个结果

时间:2014-01-28 16:37:27

标签: sql sql-server tsql

我需要将状态为9的表格中的数字复制到状态为8

的表格中

这是目前的表格:

   REF   STATUS   number
   ab12   9        3452
   ab12   8        
   cd23   9        2112
   cd23   8        

SQL:

SELECT     
    [REF]
    ,[STATUS]
    ,(select [number] 
        FROM table 
        where [REF] in 
                (select [REF] 
                   from table 
                  where [number] = '' 
                    and [STATUS] = '8') 
          and [STATUS] = '9')
 FROM [table]

我希望它返回类似的内容:

 REF   STATUS   number
 ab12  8        3452 
 cd23  8        2112

但是,因为我的子查询select [REF] from table where [number] = '' and [STATUS] = '8' 返回多行不起作用

知道怎么做吗?

3 个答案:

答案 0 :(得分:2)

您可以尝试自己加入表格。

SELECT
    t.REF,
    t2.STATUS,
    t.number
FROM [table] t
    INNER JOIN [table] t2 ON t.REF = t2.REF
WHERE t.STATUS = 9
    AND t2.STATUS = 8

答案 1 :(得分:2)

如果您尝试UPDATE原始表格,则可以执行以下操作:

UPDATE t
SET t.number = s.number
FROM [table] t
INNER JOIN [table] s
ON t.REF = s.REF
AND s.status = 9
WHERE t.status = 8
AND t.number = ''

答案 2 :(得分:1)

在这种情况下,连接是一种常见的解决方案,但是可以像您尝试的那样使用子查询,只需要将其与主查询相关联。

让我们从你(似乎)想要仅返回状态8行的事实开始,可能只有空number的那些:

SELECT
  REF,
  STATUS,
  number
FROM [table]
WHERE STATUS = 8
  AND number = ''
;

此时,您希望将NUMBER值替换为具有相同REF且状态为9的行的REF值。 (我在这里假设相同的REF不能有多个具有相同状态的行。)因此,您需要在那里放置一个子查询,使用来自main的SELECT REF, STATUS, number = ( SELECT number FROM [table] AS t2 WHERE t2.REF = t1.REF AND t2.STATUS = 9 ) FROM [table] AS t1 WHERE STATUS = 8 AND number = '' ; 值查询。但由于您将从同一个表中读取,因此您需要区分这两个实例。您可以为它们中的任何一个或每个别名指定一个别名(从长远来看可能是一个更好的主意),因此,它将是这样的:

UPDATE t1
SET
  number = (
    SELECT number
    FROM [table] AS t2
    WHERE t2.REF = t1.REF
      AND t2.STATUS = 9
  )
FROM [table] AS t1
WHERE STATUS = 8
  AND number = ''
;

如果你真的想更新行而不是返回,那么上面的查询可以很容易地更改为UPDATE:

{{1}}