【问题标题】:SQL Selecting consecutive rows with rownumSQL选择具有rownum的连续行
【发布时间】:2016-10-20 03:14:46
【问题描述】:

尝试通过脚本创建一些测试数据,使用 TableB 中尚不存在的 ID 填充 TableA.colVal。

最终结果是看到所有 TableA.colVal 最终都填充到 TableB.ID_PK 中:

INSERT INTO tableA (colVal , aPK2, aPK3) VALUES
(
  (SELECT colVal , aPK2, aPK3
    FROM tableA
    WHERE colVal   NOT IN   
    (   
       SELECT bID_PK
        FROM (SELECT bID_PK, rownum r
           FROM (SELECT bID_PK
                  FROM TableB order by bID_PK DESC)
            )
         where r = 1  -- 
       )
     and rownum = 1)
  );

如果 TableA 有 colVals 1,2,5,6,7,8 和
TableB 有 bID_PKs 1,5,7

具体来说,我想确定“失踪” 3 TableB.bID_PK 值:2、6 和 8

我尝试增加 r = 1,希望获得下一个要填充的值,但我总是得到 TableB 中找不到的第一个 TableA.colVal(所以我所有的 TableA.colVal 都获得相同的值)。更改外部选择的 rownum 也不起作用。

帮助?

澄清 我需要用 TableA.colVal 中尚不存在的 TableB.bID_PK 值填充 TableA.colVal ,其中 TableA 有一个 3 字段复合主键。我可以手动更改剩余 PK 字段的值,但我需要使用 TableB.bID_PK(这是​​ TableB 的主键)中的值填充剩余字段。

【问题讨论】:

  • 如果您希望insert 的来源是select 语句,则values 子句是错误的:INSERT INTO tableA (colVal , aPK2, aPK3) select ...

标签: sql oracle select insert rownum


【解决方案1】:

你想要的select 看起来像:

select b.id
from b
where not exists (select 1 from a where a.aid = b.bid);

您可以使用insert 插入现有表,或使用适合您数据库的语法创建新表。

【讨论】:

  • 因为 TableA 有一个复合主键,我不能按照您的解决方案规定进行批量插入。我必须在 TableA 中插入 10-20 行,其中 TableA.ID 在 TableB.ID 中还没有条目。
  • @frododot 。 . .你能用样本数据和期望的结果问另一个问题吗?我觉得这个问题不清楚,重新开始比较简单。
【解决方案2】:

对于 EXCEPT 来说可能是一个很好的用例:

INSERT INTO TableA ({Primary Key Columns})
SELECT {Primary Key Columns} FROM TableB
EXCEPT
SELECT {Primary Key Columns} FROM TableA

【讨论】:

    猜你喜欢
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多