【问题标题】:Oracle INSERT when selecting from multiple tables从多个表中选择时的 Oracle INSERT
【发布时间】:2017-12-15 15:43:23
【问题描述】:

这个查询有什么问题?我的插入需要从其他表中获取数据,但是当我使用 select 时,它给了我错误。

这里是查询:

INSERT INTO PAYMENT (
  OWNER_HI,
  ACCOUNT_ID,
  DATE_PAYMENT,
  ACCOUNT_VALUE_BEFORE,
  CURRENCY,EXCHANGE_RATE,
  SUM,
  SUM_USD,
  DATE_INPUT,
  OPERATOR_ID,
  DOCUMENT,
  INVOICE_ID)
VALUES (
  OWNER,
  ID,
  TODAY,
  SALDO,
  CURRENCY,
  RATE,
  50,
  (50 * RATE),
  TODAY,
  386,
  'teste sis',
  null)
(SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') "NOW" FROM DUAL) TODAY
(SELECT VALUE FROM ACCOUNT WHERE ACCOUNT_ID = 386) SALDO
(SELECT CURRENCY_IDCURRENCY_ID FROM CURRENCY_EXCHANGE WHERE rownum=1 ORDER BY CURRENCY_ID DESC) CURRENCY
(SELECT EXCHANGE_RATE FROM CURRENCY_EXCHANGE WHERE rownum=1 ORDER BY CURRENCY_ID DESC) RATE;

这是错误的:

SQL 错误:ORA-00933:SQL 命令未正确结束
00933. 00000 - “SQL 命令未正确结束”

【问题讨论】:

  • null); - 缺少分号

标签: database oracle oracle11g


【解决方案1】:

也许你的意思更像

INSERT INTO PAYMENT (
  OWNER_HI,
  ACCOUNT_ID,
  DATE_PAYMENT,
  ACCOUNT_VALUE_BEFORE,
  CURRENCY,EXCHANGE_RATE,
  SUM,
  SUM_USD,
  DATE_INPUT,
  OPERATOR_ID,
  DOCUMENT,
  INVOICE_ID)
VALUES (
  OWNER,
  ID,
  TO_CHAR(SYSDATE, 'YYYY-MM-DD'),
  (SELECT VALUE FROM ACCOUNT WHERE ACCOUNT_ID = 386),
  (SELECT CURRENCY_IDCURRENCY_ID FROM CURRENCY_EXCHANGE WHERE rownum=1 ORDER BY CURRENCY_ID DESC),
  (SELECT EXCHANGE_RATE FROM CURRENCY_EXCHANGE WHERE rownum=1 ORDER BY CURRENCY_ID DESC),
  50,
  (50 * RATE),
  TODAY,
  386,
  'teste sis',
  null);

祝你好运。

【讨论】:

  • 现在返回:Relatório de erros - Erro de SQL: ORA-00907: 缺少右括号 00907. 00000 - “缺少右括号”
  • Bob 的 SQL 看起来不错。也许有一些引号字符的复制粘贴错误。
【解决方案2】:

我们不能混合使用 INSERT ... VALUES 和 INSERT ... SELECT 语法。选择一个或另一个。由于您需要其他表中的值,因此您需要 INSERT ... SELECT。

您要查询的表之间没有关系,因此请使用 CROSS JOIN。只要您从每一行中只选择一行,这不会产生问题。

SELECT EXCHANGE_RATE FROM CURRENCY_EXCHANGE WHERE rownum=1 ORDER BY CURRENCY_ID DESC 不会按照您的想法执行,因为 ROWNUM 是在 在排序之前分配而不是在之后分配的。要获得最高货币,请在子查询中使用 ROW_NUMBER() 之类的分析函数并对其进行过滤。

我不得不做出几个猜测,因为你不清楚你正在实施的所有业务规则,但你需要这样的东西:

INSERT INTO PAYMENT (
  OWNER_HI,
  ACCOUNT_ID,
  DATE_PAYMENT,
  ACCOUNT_VALUE_BEFORE,
  CURRENCY,EXCHANGE_RATE,
  SUM,
  SUM_USD,
  DATE_INPUT,
  OPERATOR_ID,
  DOCUMENT,
  INVOICE_ID)
select  user, -- where does OWNER come from??
  saldo.account_id,
  trunc(sysdate),
  SALDO.value,
  CURRENCY.CURRENCY_ID ,
  CURRENCY.EXCHANGE_RATE ,
  50,
  (50 * CURRENCY.EXCHANGE_RATE ),
  trunc(sysdate),
  386,
  'teste sis',
  null
from ( select CURRENCY_ID, 
              EXCHANGE_RATE, 
              row_number() over (order by CURRENCY_ID DESC ) as rn
       FROM CURRENCY_EXCHANGE   ) currency
cross join 
    (SELECT * FROM ACCOUNT WHERE ACCOUNT_ID = 386) SALDO
where currency.rn = 1

注意:我忽略了您将 sysdate 转换为字符串(如“TODAY”),因为将日期存储为字符串是非常糟糕的做法。我希望你只是在等待从sysdate 中剥离时间元素,我们也可以通过截断来实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-28
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    相关资源
    最近更新 更多