Oracle Insert via Select from multiple tables where one table may not have a row

前端 未结 6 1670
野性不改
野性不改 2020-12-25 08:56

I have a number of code value tables that contain a code and a description with a Long id.

I now want to create an entry for an Account Type that references a number

相关标签:
6条回答
  • 2020-12-25 09:32

    Try:

    insert into account_type_standard (account_type_Standard_id, tax_status_id, recipient_id)
    select account_type_standard_seq.nextval,
           ts.tax_status_id, 
           ( select r.recipient_id
             from recipient r
             where r.recipient_code = ?
           )
    from tax_status ts
    where ts.tax_status_code = ?
    
    0 讨论(0)
  • 2020-12-25 09:33

    A slightly simplified version of Oglester's solution (the sequence doesn't require a select from DUAL:

    INSERT INTO account_type_standard   
      (account_type_Standard_id, tax_status_id, recipient_id) 
    VALUES(   
      account_type_standard_seq.nextval,
      (SELECT tax_status_id FROM tax_status WHERE tax_status_code = ?),
      (SELECT recipient_id FROM recipient WHERE recipient_code = ?)
    )
    
    0 讨论(0)
  • 2020-12-25 09:43

    Outter joins don't work "as expected" in that case because you have explicitly told Oracle you only want data if that criteria on that table matches. In that scenario, the outter join is rendered useless.

    A work-around

    INSERT INTO account_type_standard 
      (account_type_Standard_id, tax_status_id, recipient_id) 
    VALUES( 
      (SELECT account_type_standard_seq.nextval FROM DUAL),
      (SELECT tax_status_id FROM tax_status WHERE tax_status_code = ?), 
      (SELECT recipient_id FROM recipient WHERE recipient_code = ?)
    )
    

    [Edit] If you expect multiple rows from a sub-select, you can add ROWNUM=1 to each where clause OR use an aggregate such as MAX or MIN. This of course may not be the best solution for all cases.

    [Edit] Per comment,

      (SELECT account_type_standard_seq.nextval FROM DUAL),
    

    can be just

      account_type_standard_seq.nextval,
    
    0 讨论(0)
  • 2020-12-25 09:46
    insert into account_type_standard (account_type_Standard_id, tax_status_id, recipient_id)
    select account_type_standard_seq.nextval,
       ts.tax_status_id, 
       ( select r.recipient_id
         from recipient r
         where r.recipient_code = ?
       )
    from tax_status ts
    where ts.tax_status_code = ?
    
    0 讨论(0)
  • 2020-12-25 09:50

    It was not clear to me in the question if ts.tax_status_code is a primary or alternate key or not. Same thing with recipient_code. This would be useful to know.

    You can deal with the possibility of your bind variable being null using an OR as follows. You would bind the same thing to the first two bind variables.

    If you are concerned about performance, you would be better to check if the values you intend to bind are null or not and then issue different SQL statement to avoid the OR.

    insert into account_type_standard 
    (account_type_Standard_id, tax_status_id, recipient_id)
    (
    select 
       account_type_standard_seq.nextval,
       ts.tax_status_id, 
       r.recipient_id
    from tax_status ts, recipient r
    where (ts.tax_status_code = ? OR (ts.tax_status_code IS NULL and ? IS NULL))
    and (r.recipient_code = ? OR (r.recipient_code IS NULL and ? IS NULL))
    
    0 讨论(0)
  • 2020-12-25 09:55
    insert into received_messages(id, content, status)
        values (RECEIVED_MESSAGES_SEQ.NEXT_VAL, empty_blob(), '');
    
    0 讨论(0)
提交回复
热议问题