mit*_*atw 5 sql sql-server inner-query sql-update
我有一个表要使用另一个表的记录进行更新,我这样做是为了将信息从一个系统(数据库)带到另一个系统.情景有点复杂,但我迫切需要帮助:-s
有3个表- component,scan和stage_link
零件
component_id stage_id
------------ --------
1 NULL
2 NULL
3 NULL
4 NULL
5 NULL
Run Code Online (Sandbox Code Playgroud)
扫描
scan_id component_id scanner_id date_scanned
------- ------------ ---------- -----------------------
1 1 scanner_a 2012-01-01 07:25:15.125
2 1 scanner_b 2012-01-02 08:14:05.456
3 2 scanner_a 2012-01-01 12:05:45.465
4 3 scanner_a 2012-01-01 19:45:12.536
5 1 scanner_c 2012-01-03 23:33:54.243
6 2 scanner_b 2012-01-02 11:59:12.545
Run Code Online (Sandbox Code Playgroud)
stage_link
stage_link_id scanner_id stage_id
------- ---------- ----------
1 scanner_a 1
2 scanner_b 1
3 scanner_c 2
4 scanner_d 2
5 scanner_e 2
6 scanner_f 3
Run Code Online (Sandbox Code Playgroud)
我需要根据最新扫描update对表component和set字段stage_id.每次扫描都会根据所涉及的扫描仪将组件带到一个阶段.我已经update为表格编写了以下查询component,但是它会抛出错误说明;
Subquery returned more than 1 value. This is not permitted when the subquery follows '='
查询是;
UPDATE component
SET stage_id = (select stage_id
from(
select scn.scanner_id, sl.stage_id
from scan scn
INNER JOIN stage_link sl ON scn.scanner_id = sl.scanner_id
where scn.date_scanned = ( select temp_a.max_date
from ( SELECT x.component_id, MAX(x.date_scanned) as max_date
FROM scan x
where component_id = x.component_id
GROUP BY x.component_id
) as temp_a
where component_id = temp_a.component_id)
) as temp_b
)
Run Code Online (Sandbox Code Playgroud)
我正在努力,MS SQL Server并希望使用no PHP或任何其他语言对此进行排序.
我已经尝试了一天来完成这项工作,但仍然没有办法让这项工作.任何帮助将非常感谢!
非常感谢你提前:-)
在不使用相关子查询的情况下检查一下:
UPDATE Com
SET stage_id = Temp4.stage_id
FROM dbo.component Com
INNER JOIN
(
SELECT Temp2.component_id ,SL.stage_id
FROM dbo.stage_link SL
INNER JOIN (
SELECT component_id ,scanner_id
FROM scan
WHERE date_scanned IN (
SELECT MaxScanDate
FROM
(
SELECT component_id , MAX(date_scanned) MaxScanDate
FROM scan
GROUP BY component_id
) Temp
)
) Temp2 ON Temp2.scanner_id = SL.scanner_id
) Temp4 ON Com.component_id = Temp4.component_id
Run Code Online (Sandbox Code Playgroud)
输出:
component_id stage_id
------------ -----------
1 2
2 1
3 1
4 NULL
5 NULL
Run Code Online (Sandbox Code Playgroud)