MySQL查询对我来说过于复杂

时间:2015-08-24 13:06:01

标签: mysql

我试图编写一个MYSQL查询,用来从其他2个表中收集的信息更新table1中的单元格;

从其他2个表中收集数据没有太多问题(它很慢,但是因为其中一个表中有4601537个记录...(因为一个报表的所有行都被拆分了)在一个单独的记录中,意味着1个报告有超过200个记录))。

我用来将两个表连接在一起的查询是:

# First Table, containing Report_ID's: RE
# Table that has to be updated: REGI
# Join Table: JT

SELECT JT.report_id as ReportID, REGI.Serienummer as SerialNo FROM Blancco_Registration.TrialTable as REGI
JOIN (SELECT RE.Value_string, RE.report_id 
        FROM Blancco_new.mc_report_Entry as RE
        WHERE RE.path_id=92) AS JT ON JT.Value_string = REGI.Serienummer
WHERE REGI.HardwareType="PC" AND REGI.BlanccoReport=0 LIMIT 100

这会返回100条记录(我限制它,因为数据库在工作时间使用,我不想窃取所有资源)。

但是,我想在查询中使用这些结果来更新REGI表(它用于首先选择100条记录)。 但是,我在更新它时(逻辑上)得到了我无法从表中选择的错误。所以我尝试将上面的select语句选择到临时表而不是更新它;然而,我得到了一个问题,我得到了很多结果(逻辑上!我只需要1个结果并得到100)然而,我已经陷入了自己的困境......我最终需要将ReportID填入每条记录中REGI。

我知道这应该是可能的,但我不是MySQL的专家..有没有人可以指出我正确的方向?

聚苯乙烯。修复包含400k记录的表不是一个选项,它是来自外部开发人员的程序,我只能读取该数据库。

我所谈论的错误如下:

Error Code: 1093. You can't specify target table 'TrialTable' for update in FROM clause 

当我使用时:

UPDATE TrialTable SET TrialTable.BlanccoReport = 
    (SELECT JT.report_id as ReportID, REGI.Serienummer as SerialNo FROM Blancco_Registration.TrialTable as REGI
    JOIN (SELECT RE.Value_string, RE.report_id 
            FROM Blancco_new.mc_report_Entry as RE
            WHERE RE.path_id=92) AS JT ON JT.Value_string = REGI.Serienummer
    WHERE REGI.HardwareType="PC" AND REGI.BlanccoReport=0 LIMIT 100)
     WHERE TrialTable.HardwareType="PC" AND TrialTable.BlanccoReport=0)

然后我尝试了:

 UPDATE TrialTable SET TrialTable.BlanccoReport =  (SELECT ReportID  FROM (<<and the rest of the SQL>>> )  as x WHERE X.SerialNo = TrialTable.Serienummer)

但是这给了我以下错误:

Error Code: 1242. Subquery returns more than 1 row

使用LIMIT 1进行上面的查询,给出了所有相同的结果

2 个答案:

答案 0 :(得分:0)

(这不是答案,但可能指向需要进一步关注的几点)

您的JT子查询对我来说很可疑:

(SELECT RE.Value_string, RE.report_id 
        FROM Blancco_new.mc_report_Entry as RE
        WHERE RE.path_id=92
        GROUP BY RE.report_id)

您使用group by但实际上并未使用任何聚合函数。 RE.Value_string列应该严格地类似于MAX(RE.Value_string)

答案 1 :(得分:0)

首先,您的查询似乎在功能上与以下内容相同:

 SELECT RE.report_id ReportID
      , REGI.Serienummer SerialNo 
   FROM Blancco_Registration.TrialTable REGI
   JOIN Blancco_new.mc_report_Entry RE
     ON RE.Value_string = REGI.Serinummer
  WHERE REGI.HardwareType = "PC" 
    AND REGI.BlanccoReport=0 
    AND RE.path_id=92
  LIMIT 100

那么,为什么不使用它?

编辑: 我仍然没有得到它。我无法看到以下问题无法解决的问题......

UPDATE TrialTable REGI
  JOIN Blancco_new.mc_report_Entry RE
    ON RE.Value_string = REGI.Serinummer
   SET TrialTable.BlanccoReport = RE.report_id
 WHERE REGI.HardwareType = "PC" 
   AND REGI.BlanccoReport=0 
   AND RE.path_id=92;