- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个数据泵,它从 source_table
的列code
、some_data
、oz1
、oz2
、oz3
、oz4
,我将其存储在 target_table
中相同的结构。同时,我想更新另一个具有不同结构的表(比如oz_table
)——记录code
,oz
-- 即 4 条记录,而不是一条具有四个值的记录(最大值,因为不会存储 ozX
的空值和 NULL 值)。
我正在对现有的 target_table
使用 MERGE
命令 (Microsoft T-SQL)(一条记录中有 4 盎司——旧方法)。使用 OUTPUT
机制将 INSERTed/UPDATEd 记录收集到表变量 @info_table
中。 (如果源记录消失,目标记录将不会被删除;因此,没有 DELETE 操作。)
到目前为止,我有这样的代码:
CREATE PROCEDURE dbo.data_pump
AS
BEGIN
SET NOCOUNT ON
DECLARE @result int = -555 -- init (number of affected records)
DECLARE @info_table TABLE (
action nvarchar(10),
code int,
oz1 nvarchar(40),
oz2 nvarchar(40),
oz3 nvarchar(40),
oz4 nvarchar(40)
)
BEGIN TRANSACTION tran_data_pump
BEGIN TRY
MERGE target_table AS target
USING (SELECT code, some_data, oz1, oz2, oz3, oz4
FROM source_table) AS source
ON target.code = source.code
WHEN MATCHED AND (COALESCE(target.some_data, '') != COALESCE(source.some_data, '')
OR COALESCE(target.oz1, '') != COALESCE(source.oz1, '')
OR COALESCE(target.oz2, '') != COALESCE(source.oz2, '')
OR COALESCE(target.oz3, '') != COALESCE(source.oz3, '')
OR COALESCE(target.oz4, '') != COALESCE(source.oz4, '')
) THEN
UPDATE
SET target.some_data = source.some_data,
target.oz1 = source.oz1,
target.oz2 = source.oz2,
target.oz3 = source.oz3,
target.oz4 = source.oz4
WHEN NOT MATCHED THEN
INSERT (code, some_data,
oz1, oz2, oz3, oz4)
VALUES (source.code, source.some_data,
source.oz1, source.oz2, source.oz3, source.oz4)
OUTPUT
$action AS action, -- INSERT or UPDATE
inserted.code AS code,
inserted.oz1 AS oz1,
inserted.oz2 AS oz2,
inserted.oz3 AS oz3,
inserted.oz4 AS oz4
INTO @info_table;
SET @result = @@ROWCOUNT
COMMIT TRANSACTION tran_data_pump
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION tran_data_pump
SET @result = -1 -- transaction-failed indication
END CATCH
RETURN @result -- OK, number of the transfered records
END
到目前为止,一切正常。现在我想处理 @info_table
以插入/更新 oz_table
。对于操作UPDATE
,应该先删除带有code
的记录,然后插入新的记录。顺序并不重要,插入记录的新数量可能不同。 oz 中的 NULL
或空字符串不应产生任何记录。对于 INSERT
操作,情况更简单,只需插入新记录。
更新:对问题稍作修改以阐明问题的核心。数据表可以这样定义:
CREATE TABLE dbo.source_table (
ID int IDENTITY PRIMARY KEY NOT NULL,
code int,
some_data nvarchar(50),
oz1 nvarchar(40),
oz2 nvarchar(40),
oz3 nvarchar(40),
oz4 nvarchar(40)
)
CREATE TABLE dbo.target_table (
ID int IDENTITY PRIMARY KEY NOT NULL,
code int,
some_data nvarchar(50),
oz2 nvarchar(40),
oz3 nvarchar(40),
oz1 nvarchar(40),
oz4 nvarchar(40)
)
CREATE TABLE dbo.oz_table (
ID int IDENTITY PRIMARY KEY NOT NULL,
code int,
oz nvarchar(40) NOT NULL
)
查看完整的测试脚本(创建数据库、表、在 http://pastebin.com/wBz3Tzwn 调用 data_pump
如何做好?我需要高效的解决方案,因为数据量可能很大,并且操作应该尽可能快。
最佳答案
如果我正确理解了您的问题陈述,那么下面的方法可能是解决问题的一种方法 -
-- declare the temp tables
DECLARE @info_table TABLE (
action nvarchar(10),
ID int,
oz1 nvarchar(40),
oz2 nvarchar(40),
oz3 nvarchar(40),
oz4 nvarchar(40)
)
--create intermediate table to store the results
CREATE TABLE #temp_alternative_table (ID int,oz nvarchar(40))
-- insert some dummy values
INSERT INTO @info_table (action,ID,oz1,oz2,oz3,oz4)
VALUES
('INSERT',1, '85', '94', '78', '90'),
('UPDATE',2, '75', '88', '91', '78')
--SELECT * FROM @info_table
-- doing unpivot and transforming one row many columns to many rows one column and inserting into intermediate temp table
INSERT INTO #temp_alternative_table
SELECT *
FROM (
SELECT
Action
, ID
, [Oz]
FROM @info_table
UNPIVOT
(
[Oz] FOR tt IN (oz1, oz2, oz3, oz4)
) unpvt
) t
-- delete from main table all the records for which the action is UPDATE (stored in intermediate temp table for the same ID as of main table)
DELETE at
FROM alternative_table at
INNER JOIN #temp_alternative_table tat
ON at.ID = tat.ID
WHERE tat.action = 'UPDATE'
-- now insert all the records in main table
INSERT INTO alternative_table (ID,Oz)
SELECT ID,Oz
FROM #temp_alternative_table
如果这就是您要找的,请告诉我。希望这会有所帮助。
关于sql - 如何使用 MERGE 然后将一条源记录拆分为多条目标记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39656319/
我有一个数组列表: ArrayList allText = new ArrayList(); 其内容是这样的: [Alabama - Montgomery, Alaska - Juneau, Ariz
我有一个 timestamp 格式的开始和结束时间。我想将它们分成多个时间段,例如 1 小时。 $t1 = strtotime('2010-05-06 12:00:00'); $t2 = strtot
我需要将 span10 分成 3 列,但我无法将它们排列起来。我应该在 span10 中添加一个 span12 还是使用 offset 还是??
我有一个时间序列。我想从早上 8 点到第二天早上 7:59 分成 24 小时的区 block 。我知道如何按日期分组,但我尝试过使用 TimeGroupers 和 DateOffsets 处理这个 8
我收到“街道号码邮政编码城市”形式的地址(作为字符串)。我想要做的是将街道和号码与邮政编码和城市分开。通常你可以按空格分割。但有些街道名称中也有空格,例如:“Emile Van Ermengemlaa
我有一个用户列表。其中一些用户处于第一状态,而其他用户处于第二状态。所以我想要的是将这个列表显示为首先,它按排序顺序显示存在 = 1 的用户,然后按排序顺序显示存在 = 2 的用户。这里的排序是根据用
我感觉我搜索了整个网络,但找不到一种方法将不同高度的 div 很好地划分为 3 列,就像 http://www.ing.nl 上那样 headertekst headerteksttesth
Bootstrap 3 按钮下拉菜单出现问题。你可以在这里看到我的两个例子: http://www.bootply.com/W1dLusilMk http://www.bootply.com/GGBv
我在 php 中执行以下操作 foreach($QuestionAsekd as $k => $v){ $grp_name = $v['NAME']; $groupValues[$gr
我找到了一种用pandas解析html的绝妙方法。我的数据格式有点奇怪(见下文)。我想将这些数据拆分为 2 个单独的数据帧。 注意每个单元格如何由,分隔...是否有任何真正有效的方法来分割所有这些单元
HTML 看起来像这样,但我不允许对其进行更改。我只能编写 CSS 将其变成 2 列。 Povezave www.behance.net www.kiberpipa.org www.o
假设我有以下数据框“A” utilization utilization_billable service 1
我需要将 2 个文本框拉伸(stretch)到 100% 的浏览器宽度,以及一个提交按钮。所有三个都应该在一行中,我试图拉伸(stretch)它但它没有发生......有什么想法吗? 代码: .sea
我是一名优秀的程序员,十分优秀!