【问题标题】:Unable to insert id column of table in order using sequence.nextvalue无法使用 sequence.nextvalue 按顺序插入表的 id 列
【发布时间】:2015-03-25 06:47:32
【问题描述】:

我使用 Oracle 作为数据库,我有两个表。

TableOne-->tableOneId(Primary key)

TableTwo-->tableTwoId(Primary key),tableOneId(Foreign Key),City

现在 TableOne 中有许多记录,对于表 1 中的每条记录,我尝试使用以下查询在表 2 中插入 5 个城市。

insert into tableTwo (tableTwoId,tableOneId,City)
select TableTwo_SEQ.nextval,tableOneId,City from TableOne,(select 'city1' City from dual union select 'city2' City from dual
union select 'city3' City from dual union select 'city4' City from dual union select 'city5' City from dual)

但是为每个 tableOneId 插入的城市没有排序表二。 例如

SQL: select * from TableTwo where tableOneId='1022' order by tableTwoId

----------------------------------------
tableTwoId    tableOneId     City
----------------------------------------
10336          1022          City five

10889          1022          City four

11442          1022          City one

11995          1022          City three

12548          1022          City two

如何按城市顺序插入 tableTwoId。

【问题讨论】:

  • 发布相关表的 DDL 和 INSERT。此外,您的插入选择正在进行 笛卡尔连接,因此 553 迭代。

标签: sql oracle insert sequence


【解决方案1】:
SELECT TableTwo_SEQ.nextval,
  tableOneId,
  City
FROM TableOne,
  (SELECT 'city1' City FROM dual
  UNION
  SELECT 'city2' City FROM dual
  UNION
  SELECT 'city3' City FROM dual
  UNION
  SELECT 'city4' City FROM dual
  UNION
  SELECT 'city5' City FROM dual
  )

您正在执行 CARTESIAN JOIN,因此对于 TableOne 中的每一行,在 union all 中都有一个包含 5 行的连接。因此,您会看到每个序列号之间存在553 的差异。这意味着笛卡尔积产生了 553 行。

您必须指定一个键来连接表和内联视图,或者在 5 个单独的插入中执行。

例如,

INSERT INTO tableTwo
  (tableTwoId,tableOneId,City
  )
SELECT TableTwo_SEQ.nextval,
  tableOneId,
  'city1'
FROM TableOne;

INSERT INTO tableTwo
  (tableTwoId,tableOneId,City
  )
SELECT TableTwo_SEQ.nextval,
  tableOneId,
  'city2'
FROM TableOne;

INSERT INTO tableTwo
  (tableTwoId,tableOneId,City
  )
SELECT TableTwo_SEQ.nextval,
  tableOneId,
  'city3'
FROM TableOne;

INSERT INTO tableTwo
  (tableTwoId,tableOneId,City
  )
SELECT TableTwo_SEQ.nextval,
  tableOneId,
  'city4'
FROM TableOne;

INSERT INTO tableTwo
  (tableTwoId,tableOneId,City
  )
SELECT TableTwo_SEQ.nextval,
  tableOneId,
  'city5'
FROM TableOne;

这将为每个 tableOneId 插入 5 个城市。

【讨论】:

  • 嗨拉利特,我也得到了与单独插入相同的结果。我仍然得到了 553 行的差异。
  • 然后发布create table和insert语句构建测试用例
【解决方案2】:

我使用以下查询解决了这个问题:

INSERT INTO tableTwo 
SELECT TableTwo_SEQ.nextval,
    tableOneId,
    City
  FROM
    (SELECT tableOneId,
      City
    FROM TableOne,
      (SELECT 'city1' City FROM Dual
      UNION
      SELECT 'city1' City FROM Dual
      UNION
      SELECT 'city1' City FROM Dual
      UNION
      SELECT 'city1' City FROM Dual
      UNION
      SELECT 'city1' City FROM Dual
      ) elg
    ORDER BY 1,
      2
    );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 2012-08-23
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多