2017-07-11 52 views
0

此查詢有什麼問題?我的插入需要從其他表中獲取數據,但是當我使用select時,它給了我錯誤。從多個表中選擇時插入Oracle INSERT

下面是該查詢:

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命令沒有正確結束「

+0

null); - 缺少分號 –

回答

2

也許你的意思是更像

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

祝你好運。

+0

現在返回:錯誤 - 錯誤SQL:ORA-00907:缺少右括號 00907. 00000 - 「缺少右括號」 – phzao

+0

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中消除時間元素,我們也可以通過截斷來實現。