【问题标题】:insert into table select from table where columnname = xxx and columnname2 = yyy looping too many times从表中插入表中选择,其中列名 = xxx 和列名2 = yyy 循环太多次
【发布时间】:2018-11-16 13:23:15
【问题描述】:

我会尽量做到完整但简洁。如果我遗漏了什么,请告诉我。

我有一系列活动,每个活动都包含完成给定活动所需的步骤。每个步骤都有一些与步骤相关的附加组件。如果你把它看成一棵树,它会是这样的:

ACTIVITY -- STEP ---- COMPONENT

下面是组件表的数据集结果。

我希望编写一个 mySQL 插入/选择语句,它允许我复制 ID = 84。但是在插入时,ID 值应该继承 ACTIVITY 的新 ID(例如,让我们使用 299),而 AID 应该继承 STEP 值的新 ID(例如,让我们使用 501,502,503,504,505,506) .

我知道 mySQL 语句会是什么样子,这不是问题所在。我遇到的问题是如何编写循环,以便我可以传入新的 ID 和新的 AID 值。 SID 是主键(自动递增)。

使用上面给定的数据集,我希望插入 6 条新记录。相反,我得到 9,所以我的循环没有正确循环,或者我传递了错误的数据。

这是循环:

for (local.data.newAID in local.data.list_newAID){
    //  COPY SET
    for (local.data.origAID in local.data.list_existingAID){
        local.formDataStruct.origAID = local.data.origAID;
        variables.workoutDAO.makeCopyCoreSet(
            origID = local.dataStruct.ID,
            newID = local.dataStruct.newID,
            origAID = local.dataStruct.origAID,
            newAID = local.dataStruct.newAID
        );
    }
}

这里是makeCopyCoreSet函数:

INSERT INTO SET(ID, LID, AID)
SELECT
    :newID, LID, :newAID
FROM
    Set
WHERE ID = :origID AND AID = :origAID;

我错过了什么?

【问题讨论】:

  • 什么是LID?什么版本的 MySQL?
  • LID 是 locationID 中的位置,但该功能尚未实现。
  • 看起来你正在为每个循环做一个 INSERT。这可以打败你的数据库。
  • 同意。我不会反对我也在研究的单个插入语句。我想如果我可以让它工作,我可以在我获得一些更好的理解后修改它以循环查询插入语句。我对选择/插入循环没有太多经验。
  • 是的,我讨厌这样做。我喜欢 dbfiddle.uk,但这一直困扰着我。 :-S

标签: coldfusion mariadb lucee


【解决方案1】:

我们想要复制我们的一个活动,因此我们想要传递我们想要复制的 ID 和我们想要成为新 ID 的 ID(除非我们有其他方法来确定它。

variables.workoutDAO.NEW_makeCopyCoreSet(
            origID = local.dataStruct.ID,
            newID = local.dataStruct.newID
        );

然后在我们的 NEW_makeCopyCoreSet() 函数(一个 CF 函数)中,我们有查询:

INSERT INTO component (ID, LID, AID)
SELECT DISTINCT :newID, LID, AID 
FROM component
WHERE ID = :origID

查看它的实际效果(从 SQL 方面):

https://dbfiddle.uk/?rdbms=mariadb_10.2&fiddle=ba4328dca3327814a7dc18fea284ead8

首先我们设置基础数据。

/* SETUP 1 */
CREATE TABLE component ( ID int, LID int, AID int, SID int UNIQUE AUTO_INCREMENT)

/* SETUP 2 */
INSERT INTO component (ID, LID, AID)
SELECT 84,0,432 UNION ALL
SELECT 84,0,433 UNION ALL
SELECT 84,0,434 UNION ALL
SELECT 84,0,435 UNION ALL
SELECT 84,0,435 UNION ALL
SELECT 84,0,435 UNION ALL
SELECT 84,0,435 UNION ALL
SELECT 84,0,436 UNION ALL
SELECT 84,0,437

/* What's in the original? */
SELECT * FROM component
身份证 |盖子 |援助 | SID -: | --: | --: | --: 84 | 0 |第432章1 84 | 0 |第433章2 84 | 0 |第434章3 84 | 0 | 435 | 4 84 | 0 | 435 | 5 84 | 0 | 435 | 6 84 | 0 | 435 | 7 84 | 0 |第436章8 84 | 0 |第437章9

然后我们将现有 ID 复制到新 ID。

/* Copy an ID. */
INSERT INTO component (ID, LID, AID)
SELECT DISTINCT 299, LID, AID 
FROM component
WHERE ID = 84

/* What's in the table for the new ID? */
SELECT * FROM component WHERE ID = 299
身份证 |盖子 |援助 | SID --: | --: | --: | --: 299 | 0 |第432章16 299 | 0 |第433章17 299 | 0 |第434章18 299 | 0 | 435 | 19 299 | 0 |第436章20 299 | 0 |第437章21

【讨论】:

  • 嘿肖恩,我遇到了一个问题。看起来我们/我完全忘记了新的 AID 值 501,502,503,504,505,506。ID 部分有效,但我如何也循环遍历新的 AID 值,使 501 对应于 432,502 对应于 433 等等?
  • 您说 SID 是一个自动编号。你能退后一步定义这些列中的每一个代表什么吗?那是该表中的全部内容,还是有其他列进一步定义了 SID 编号之间的差异?您现在要求的内容与您原来的显示不符。我不确定你的数字是如何排列的。我知道您不能过于明确地保护您的数据,但我需要了解您如何确定 component 表的基础知识。您能否提供一个简单的步骤和活动表示例? “501对应432”是什么意思?
  • 我能够解决问题。用 500 个字符或更少的字符编写有点复杂,但它现在运行良好,感谢您让我朝着正确的方向前进。
  • 很高兴你得到了解决。
猜你喜欢
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
相关资源
最近更新 更多