SQL INNER QUERY在UPDATE查询中返回多个值

mit*_*atw 5 sql sql-server inner-query sql-update

我有一个表要使用另一个表的记录进行更新,我这样做是为了将信息从一个系统(数据库)带到另一个系统.情景有点复杂,但我迫切需要帮助:-s

有3个表- component,scanstage_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对表componentset字段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或任何其他语言对此进行排序.

我已经尝试了一天来完成这项工作,但仍然没有办法让这项工作.任何帮助将非常感谢!

非常感谢你提前:-)

Kas*_*ash 3

在不使用相关子查询的情况下检查一下:

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)