合并2个表并从中提取最新记录

时间:2016-03-11 18:03:56

标签: sql sql-server tsql

假设我有两个具有相同列的客户表。其中一个是暂时的,它定期更新另一个。也就是说,记录的更新和添加仅对时态表进行。假设他们的名字是CUSTOMERCUSTOMER_TEMP

表格中包含IDNAMELAST_NAMEADDRESS等信息。

此时态表有三个额外字段TEMP_IDRECORD_TYPEDATE。记录类型用于记录是添加还是更新。所以我需要从两个表中选择最新记录。这涉及几个案例

  • 主表有记录,但暂时没有 - >选择主表记录。
  • 主表没有记录,但是暂时没有记录 - >选择最新的时态表记录。
  • 主表有记录,临时有添加记录 - >选择时态表记录。
  • 主表有记录,临时表有更新记录 - >选择时态表记录。
  • 主表有记录和临时表有添加和更新记录。 - >选择时态表更新记录。
  • 主表有记录,临时表有各种更新记录。 - >选择最新的临时表更新记录。
  • 主表有记录,临时表有添加记录和各种更新记录。 - >选择最新的临时表更新记录。

现在,我不知道这是否是一个好的流程。我被告知要进行查询,所以我无法访问数据库,我相信我可以提出建议。事情是我的SLQ知识不足以构建此查询。我知道有INNER_JOIN涉及,以及按日期过滤,可能还有EXIST,以检查CUSTOMER_TEMP表中是否存在记录。但我不太清楚如何构建它。我正在研究.Net和SQLServer。对它的任何帮助都非常感激。

2 个答案:

答案 0 :(得分:2)

select m.*, 0 as [rn]
from main m 
where not exists (select 1 from temp where temp.id = m.id) 
union 
select tt.* 
from ( select temp.*
            , row_number() over (partition by id order by RECORD_TYPE desc, date desc) as rn
         from temp 
      -- join main 
      --       on temp.ID = main.ID 
     ) tt
where tt.rn = 1  

如果更新没有排序,那么需要像Tom H的答案那样做一个技巧

答案 1 :(得分:1)

listBox1.SelectedIndexChanged += listBox_SelectedIndexChanged;
listBox2.SelectedIndexChanged += listBox_SelectedIndexChanged;
listBox3.SelectedIndexChanged += listBox_SelectedIndexChanged;

bool changingSelection = false;

void listBox_SelectedIndexChanged(object sender, EventArgs e) {
  if (!changingSelection) {
    int index = ((ListBox)sender).SelectedIndex;
    if (index > -1) {
      changingSelection = true;
      listBox1.SetSelected(index, true);
      listBox2.SetSelected(index, true);
      listBox3.SetSelected(index, true);
      changingSelection = false;
    }
  }
}

对于任何不能;WITH CTE_Latest_Temporal AS ( SELECT id, name, ..., -- Put the rest of your columns here ROW_NUMBER OVER (PARTITION BY id ORDER BY CASE record_type WHEN 'Update' THEN 0 ELSE 1 END, date DESC) AS row_num FROM Customer_Temp ) SELECT M.id, CASE WHEN T.id IS NOT NULL THEN T.name ELSE M.name END AS name, ... -- Similar CASE statements for the rest of your columns FROM Customer M LEFT OUTER JOIN CTE_Latest_Temporal T ON T.id = M.id AND T.row_num = 1 的列,CASE语句都可以替换为简单COALESCE(T.column, M.column)。我不得不使用NULL来涵盖临时表中可能存在行的情况,但临时表中的列可能是CASE,但主表中有一个值。