繁体   English   中英

如何限制记录

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM