【问题标题】:Insert into..select with condition插入到..选择条件
【发布时间】:2016-07-23 17:30:03
【问题描述】:

我有两张桌子

表 1:

process  status
 1        completed
 2       completed 
 3       not completed

table 2 ;是一个从 table1 获取数据的历史表

process status
1       completed
2       completed
3      not completed

下次当数据从表 1 推送到历史表时,我只想推送状态为“未完成”的数据

这样我的历史记录表如下所示

表2(历史表)

Process   status
  1       completed
  2       completed
  3       not completed
  3       completed

请帮我解决这个问题,我已经尝试过子查询,但它不适合我。

我使用了这个查询:

INSERT INTO table2 
    SELECT * 
    FROM table1 
    WHERE NOT (status IN (SELECT Status 
                          FROM table2 
                          WHERE status = 'completed'))

【问题讨论】:

    标签: sql sql-server select insert


    【解决方案1】:

    试试这个。

    INSERT INTO table2 (process,status)
    select process,'completed' as status From table1 where process in
    (select distinct process from table2 where status <> 'completed')
    

    【讨论】:

    • 不要在insert 声明中推荐*。那么&lt;&gt;在比较单个值时会更有意义
    • 我需要检查表 2 中状态 已完成的记录的状态,并仅从表 1 中获取这些记录
    • 所以从table2处理3符合您的条件,您想将其插入table2,状态为complete
    • 进程 3 根据 table2 是不完整的,所以下次当数据从 table1 插入 table2 时,它应该只用于 process3,因为它的状态是不完整的。我只需要更新那些状态不完整的进程。
    • 查看更新后的答案。虽然硬编码status 对我来说没有多大意义,但看起来这就是你所需要的。请确认。
    【解决方案2】:

    如果您想在 both 表格匹配某些列,请使用此选项:

    UPDATE _table_name_ 
    SET col1 = _alias_table_.col1, ... /* all columns except merge keys and Identity column */
    FROM (SELECT * FROM _tmp_table1_ UNION SELECT * FROM _tmp_table2_) _alias_table_
    WHERE _table_name_._merge_key_ = _alias_table_._merge_key_ /* could be multiple merge keys */
    

    示例:

    update orderdetails 
    set productname = a.productname 
    from (select productid,productname from products) as a 
    join orderdetails o 
    on o.productid = a.productid 
    where a.productid = o.productid; 
    

    【讨论】:

      【解决方案3】:

      AFAI 理解您的问题,您只需要更新从不完整状态变为完成状态(假设流程从不完整到完成是线性的)的流程状态。

      INSERT INTO table2 (process,status)
      SELECT 
      T1.process as process, 
      CASE T1.state WHEN 0 THEN 'not completed ' ELSE 'completed' END as status
      FROM 
      (SELECT process, MAX(CASE WHEN status = 'not completed' THEN 0 WHEN status ='completed' THEN 1 END) state from table1 group by process) T1 
      LEFT JOIN 
      (SELECT process, MAX(CASE WHEN status = 'not completed' THEN 0 WHEN status ='completed' THEN 1 END) state from table2 group by process) T2
      ON  T1.process=T2.process 
      WHERE T2.process is NULL OR T2.state<> T1.state
      

      SQL demo here

      【讨论】:

        猜你喜欢
        • 2016-05-16
        • 1970-01-01
        • 1970-01-01
        • 2018-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-19
        • 1970-01-01
        相关资源
        最近更新 更多