我试图编写一个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进行上面的查询,给出了所有相同的结果
答案 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;