【问题标题】:How to select data and insert those data using single sql?如何使用单个 sql 选择数据并插入这些数据?
【发布时间】:2013-09-16 07:02:08
【问题描述】:

我想使用简单的 sql 选择一些数据并将这些数据插入到另一个表中。两张表是一样的。数据类型和列名都相同。只是那些是主表的临时表。使用单个 sql 我想将这些数据插入到另一个表中,并在 where 条件下检查 E_ID=?检查部分。我的另一个问题是有时表中可能有任何匹配的行。在那个时候是不是可能出sql异常?另一个问题是它可能是多个匹配的行。这意味着一个 E_ID 可能有多行。例如,在我的 attachment_master 和 attachments_temp 表中,一个 ID 具有多行。我该如何解决这些问题?我还有一个问题。我的主表数据可以使用以下代码插入临时表。但我只想更改一列,其他列是相同的数据。因为我想更改临时表状态列。

    insert into dates_temp_table SELECT * FROM master_dates_table where e_id=?;

在这里,所有数据都插入到我的 dates_temp_table 中。但我想添加所有列数据并仅将 dates_temp_table 状态列更改为“已修改”。我应该如何更改此代码?

【问题讨论】:

  • 如果目标表中存在匹配的行,你想做什么?忽略或更新或删除?
  • 我想将请求的 id 值添加到临时表中,并将 temp_table 列状态更改为“已修改”。

标签: sql database select insert oracle10g


【解决方案1】:

你可以试试这个:

insert into table1 ( col1, col2, col3,.... ) 
SELECT  col1, col2, col3, ....
FROM   table2 where (you can check any condition here on table1 or table2 or mixed)

更多信息请查看herethis similar question 希望对您有所帮助。

编辑:如果我正确理解您的要求,那么这对您来说可能是一个有用的解决方案:

insert into table1 ( col-1, col-2, col-3,...., col-n, <Your modification col name here> ) 
    SELECT  col-1, col-2, col-3,...., col-n, 'modified'
    FROM table2 where table1.e_id=<your id value here>

根据您在上述其他答案中的评论:

“我发送我的 E_ID。我不想匹配和获取。我发送我的 E_ID 和 如果该 ID 可用,我将这些数据插入到我的临时表中并更改 临时表状态为“已修改”,否则不执行任何操作。”

根据您的上述陈述,如果给定 e_id,它会将所有列值复制到您的 table1 中,并将在 table1 的“状态”列中放置一个值“已修改”

更多信息请看here

【讨论】:

  • 谢谢,工作正常。但我不明白当 where 条件有任何匹配值时如何自动处理。
  • 我想将请求的 id 值添加到临时表中,并将 temp_table 列状态更改为“已修改”。
  • 我编辑了我的答案并添加了一些内容。我可能不正确理解您的要求。如果是这样,请告诉我更多细节。
【解决方案2】:

如果我正确理解您的要求,您可以使用合并语句。

Documentation

由于我没有下面的表格结构是基于假设的,请查看这是否满足您的要求。我假设 e_id 是主键或根据您的表设计进行更改。

MERGE INTO   dates_temp_table trgt
      USING  (SELECT * FROM master_dates_table WHERE e_id=100) src
          ON     (trgt.prm_key = src.prm_key)  
WHEN NOT MATCHED
THEN
    INSERT       (trgt.col, trgt.col2, trgt.status)
         VALUES  (src.col, src.col2, 'Modified');

更多信息和示例here

【讨论】:

  • 我发送我的 E_ID。我不想匹配和获取。我发送我的 E_ID,如果该 ID 可用,我将这些数据插入到我的临时表中,并将临时表状态更改为“已修改”,否则不执行任何操作。我该怎么做?
  • @user2632766 但是您在问题中提到您有匹配的行!如果您有匹配的行,则使用您的主键匹配并在 where 条件中使用“E_ID”。我已经编辑了我的答案。
  • 我已经删除了更新部分,因此如果行匹配,它将不会进行任何更新。如果行不匹配,它将插入行,status 列将被标记为Modified
  • 我觉得有些误会。我有两个表日期主表和日期临时表。日期临时表没有任何数据。然后系统用户传递 id,我想如果该 id 在日期主表中可用,则整个数据复制到临时表(一行)中,除了 STATUS 列。因为我想将状态更改为“已修改”。
  • @user2632766 如果它没有解决您的问题,您需要发布您的表结构和示例数据。
【解决方案3】:
insert into tablename( column1, column2, column3,column4 ) SELECT  column1,
column2, column3,column4 from anothertablename where tablename.ID=anothertablename.ID

如果有多个值,那么它将返回最后一个结果。如果没有,则缩小搜索范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2013-05-25
    相关资源
    最近更新 更多