假设我有两个具有相同列的客户表。其中一个是暂时的,它定期更新另一个。也就是说,记录的更新和添加仅对时态表进行。假设他们的名字是CUSTOMER
和CUSTOMER_TEMP
。
表格中包含ID
,NAME
,LAST_NAME
和ADDRESS
等信息。
此时态表有三个额外字段TEMP_ID
,RECORD_TYPE
和DATE
。记录类型用于记录是添加还是更新。所以我需要从两个表中选择最新记录。这涉及几个案例
现在,我不知道这是否是一个好的流程。我被告知要进行查询,所以我无法访问数据库,我相信我可以提出建议。事情是我的SLQ知识不足以构建此查询。我知道有INNER_JOIN
涉及,以及按日期过滤,可能还有EXIST
,以检查CUSTOMER_TEMP
表中是否存在记录。但我不太清楚如何构建它。我正在研究.Net和SQLServer。对它的任何帮助都非常感激。
答案 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
,但主表中有一个值。