【问题标题】:Insert ALL from a another table从另一个表中插入 ALL
【发布时间】:2018-08-01 21:42:23
【问题描述】:

我正在尝试一次性执行以下语句。就像我们使用 INSERT ALL 在单次执行中插入行一样。有什么方法可以在一次执行中执行以下两条语句(使用 INSERT ALL)。

INSERT
INTO TABLE_a
  (
    COLUMN_1,
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
  )
SELECT 1234, -- unique id for this insertion
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
FROM TABLE_B
WHERE COLUMN_9=1;
INSERT
INTO TABLE_a
  (
    COLUMN_1,
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
  )
SELECT 1235, -- unique id for this insertion
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
FROM TABLE_B
WHERE COLUMN_9=2;

【问题讨论】:

  • 这与 INSERT ALL 有什么关系? (提示:NOTHING!)您可以在单个 INSERT 语句中轻松做到这一点:只保留第一个语句,但将 WHERE 子句更改为 WHERE COLUMN_9 IN (1, 2)
  • 我的错,我的例子是错误的。我已经更新了问题。

标签: oracle plsql oracle11g oracle12c


【解决方案1】:

当然,你可以使用in clause同时收集Id 1和2

并使用decode 区分 1234 和 1235:

INSERT
INTO TABLE_a
  (
    COLUMN_1,
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
  )
SELECT decode(COLUMN_9,1,1234,2,1235),
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
FROM TABLE_B
WHERE COLUMN_9 in (1,2);

【讨论】:

  • 您缺少 column_1 的不同值,具体取决于 column_9 的不同值
【解决方案2】:

您可以将INSERT INTO ... SELECT 与联合查询一起使用:

INSERT INTO TABLE_a (COLUMN_1, COLUMN_2, COLUMN_3, COLUMN_4, COLUMN_5, COLUMN_6,
    COLUMN_7, COLUMN_8)
SELECT
    1234, COLUMN_2, COLUMN_3, COLUMN_4, COLUMN_5, COLUMN_6, COLUMN_7, COLUMN_8
FROM TABLE_B
WHERE COLUMN_9 = 1
UNION ALL
SELECT
    1235, COLUMN_2, COLUMN_3, COLUMN_4, COLUMN_5, COLUMN_6, COLUMN_7, COLUMN_8
FROM TABLE_B
WHERE COLUMN_9 = 2

与您原来的方法相比,这种方法有一个明显的优势。有了这个答案,整个插入都发生在一个语句中。

【讨论】:

  • 我的错,我的例子是错误的。我已经更新了问题。
  • 如果有 5 个 select 语句还是可以的,在 select 语句之间有 union all 吗?
  • 是的,您可以根据需要联合起来。 Oracle 可能会施加限制,但它可能不会在 5 时发生,假设这 5 个选择中的每一个都不大或需要很长时间。
  • 与 DECODE 或可能的 CASE 解决方案相比,此解决方案还具有明显的 dis优势,它读取 TABLE_B 两次(或五次,如果 OP需要对COLUMN_9 中的五个不同值执行此操作。
【解决方案3】:

为什么不使用 OR 条件?如果它适合你,试试这个

INSERT
INTO TABLE_a
  (
    COLUMN_1,
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
  )
SELECT CASE WHEN COLUMN_9 = 1 THEN 1234 WHEN COLUMN_9 = 2 THEN 1235 END,
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
FROM TABLE_B
WHERE COLUMN_9=1 OR COLUMN_9=2;

按照@Chris 的建议使用 DECODE() 函数

INSERT
INTO TABLE_a
  (
    COLUMN_1,
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
  )
SELECT DECODE(COLUMN_9,1,1234,2,1235)
    COLUMN_2,
    COLUMN_3,
    COLUMN_4,
    COLUMN_5,
    COLUMN_6,
    COLUMN_7,
    COLUMN_8
FROM TABLE_B
WHERE COLUMN_9=1 OR COLUMN_9=2;

【讨论】:

  • 我的错,我的例子是错误的。我已经更新了问题。
  • @Hareesh.check 已编辑答案.. 您可以使用 CASE WHEN 语句根据 TABLE_B 的 Column_9 中的值在 TABLE_A column_1 中插入所需的值,即 1 或 2,然后分别插入 1234 和 1235。
  • 同样只需要一个 SELECT 语句,唯一 id 插入由 CASE 语句处理
  • 你也可以使用oracle中的DECODE-Function:DECODE(column_name, value1, ret_value1, value2, retvalue2, defaultvalue)。 DECODE 最多可以处理 255(?) 个值。适用于整数、字符和所有内容
  • @Chriz 感谢分享.. 我喜欢 SQL Server.. 不知道 DECODE() 函数.. 很高兴现在学习新东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 2018-12-05
  • 2017-08-01
  • 1970-01-01
  • 2015-05-28
  • 2012-12-05
相关资源
最近更新 更多