Database 从多个表中选择时的Oracle插入

Database 从多个表中选择时的Oracle插入,database,oracle,oracle11g,Database,Oracle,Oracle11g,这个查询有什么问题?我的insert需要从其他表中获取数据,但当我使用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) VALU

这个查询有什么问题?我的insert需要从其他表中获取数据,但当我使用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命令未正确结束
93300000-“SQL命令未正确结束”


也许你的意思更像

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);

祝你好运。

也许你的意思更像

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);

祝你好运。

我们不能混用插入。。。值并插入。。。选择语法。选择一个或另一个。由于需要其他表中的值,因此需要插入。。。选择

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

SELECT EXCHANGE\u RATE FROM CURRENCY\u EXCHANGE,其中rownum=1 ORDER BY CURRENCY\u ID DESC
不会执行您认为它会执行的操作,因为rownum是在排序之前而不是之后分配的。要获取最高货币,请在子查询中使用分析函数,如
ROW\u 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
转换为字符串(如“今天”),因为将日期存储为字符串是一种非常糟糕的做法。我希望您只是在等待从
sysdate
中剥离时间元素,这也可以通过截断来实现。

我们不能混合插入。。。值并插入。。。选择语法。选择一个或另一个。由于需要其他表中的值,因此需要插入。。。选择

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

SELECT EXCHANGE\u RATE FROM CURRENCY\u EXCHANGE,其中rownum=1 ORDER BY CURRENCY\u ID DESC
不会执行您认为它会执行的操作,因为rownum是在排序之前而不是之后分配的。要获取最高货币,请在子查询中使用分析函数,如
ROW\u 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
转换为字符串(如“今天”),因为将日期存储为字符串是一种非常糟糕的做法。我希望您只是在等待从
sysdate
中剥离时间元素,我们也可以通过截断来实现这一点。

null);-缺少分号(空);-缺少分号现在返回:Relatório de erros-Erro de SQL:ORA-00907:缺少右括号00907。00000-“缺少右括号”来自Bob的SQL看起来不错。可能有一些引号字符的复制粘贴错误。现在返回:Relatório de erros-Erro de SQL:ORA-00907:缺少右括号00907。00000-“缺少右括号”来自Bob的SQL看起来不错。可能有一些引号字符的复制粘贴错误。