我需要将状态为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'
返回多行不起作用
知道怎么做吗?
答案 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}}