【问题标题】:How to Limit the records如何限制记录
【发布时间】:2021-12-22 05:38:36
【问题描述】:

我有两张表,分别称为 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 到 Master 插入最多 100 条记录。不,要插入的数据没有排序标准。我怎样才能做到这一点?

【问题讨论】:

  • 我会把它从 MERGE 中分离出来,分成单独的 UPDATEINSERT 语句。到那时就变得微不足道了。
  • 插入(或任意)的数据是否有排序标准,DB的版本是多少?
  • @EricBrandt:请您帮忙看看单独的 UPDATE 和 INSERT 语句是什么样的?
  • @BarbarosÖzhan:不,没有排序标准。 Oracle 版本为 12.x

标签: sql oracle oracle12c sql-merge


【解决方案1】:

主要思想是检查来自daily的新记录是否存在,是否存在于表master中,就像从master获取所有记录,同时将它们限制为100行来自master的数据。

  • 使用NVL2()函数判断存在
  • 使用FETCH 子句过滤不存在​​的数据100 行使用版本12 的数据库而不使用ORDER BY 子句,因为您在获取数据时不需要任何排序标准。

因此,将MERGE 语句中的表名daily 替换为以下子查询

(
 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 的Demo

【讨论】:

    【解决方案2】:

    你可以使用:

    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小提琴here

    【讨论】:

      猜你喜欢
      • 2021-04-19
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多