[英]How to Limit the records
我有两张桌子,分别叫做“daily”和“master”。 每日表每天都会被截断,但主表保存数据并且永远不会被截断。 每天我都运行一个 SQL 脚本将 Daily 表数据与 Master 表合并,如下所示在存储过程中:
UPDATE master
SET offset = COALESCE(offset + 1, 0);
MERGE INTO master m
USING daily d
ON (m.id = d.id)
WHEN MATCHED THEN
UPDATE SET offset = 0
WHEN NOT MATCHED THEN
INSERT (id, col1, col2, col3, offset)
VALUES (d.id, d.col1, d.col2, d.col3, NULL);
这工作正常,但在 WHEN NOT MATCHED 子句中,我只需要从 Daily 插入最多 100 条记录到 Master。 不,要插入的数据没有排序标准。 我怎样才能做到这一点?
你可以使用:
MERGE INTO master m
USING (
SELECT *
FROM (
SELECT d.*,
m.ROWID AS rid,
ROW_NUMBER() OVER (
PARTITION BY CASE WHEN m.ROWID IS NULL
THEN 'Insert'
ELSE 'Update'
END
ORDER BY ROWNUM
) AS rn
FROM daily d
LEFT OUTER JOIN master m
ON (m.id = d.id)
)
WHERE rid IS NOT NULL -- Update all rows.
OR rn <= 100 -- Only insert 100 rows.
) d
ON (m.ROWID = d.rid) -- Use the ROWID psuedo-column to join.
WHEN MATCHED THEN
UPDATE SET offset = 0
WHEN NOT MATCHED THEN
INSERT (id, col1, col2, col3, offset)
VALUES (d.id, d.col1, d.col2, d.col3, NULL);
db<> 在这里摆弄
主要思想是检查来自daily
的新记录是否存在,是否存在于表master
,因为从master
获取所有记录,同时将它们限制为100
行来自master
的数据。
NVL2()
函数判断是否存在100
行使用FETCH
子句过滤不存在的数据,就像使用版本 12 的数据库而不使用ORDER BY
子句一样,因为在获取数据时不需要任何排序条件。 因此, daily
用以下子查询替换MERGE
语句中的表名
(
WITH t AS
(
SELECT d.*, NVL2(m.id,1,0) AS exist
FROM daily d
LEFT JOIN master m
ON m.id = d.id
)
SELECT *
FROM t
WHERE exist = 1
UNION ALL
(SELECT *
FROM t
WHERE exist = 0
FETCH FIRST 100 ROWS ONLY)
)
感谢@MT0 的演示
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.