简体   繁体   中英

Error in select statement, with union all in a subquery

In Oracle 11g, I came across an error for a query and cannot figure why it is erroring on me. Here is the query:

select
  main_data.issue_number,
  main_data.transaction_number
 from
 (
    select
      p1.payment_date,
      p1.media_number,
      p1.payment_amount,
      p1.issue_number, 
      p1.advice_na_number,
      name.name_address_line_1,
      name.name_address_line_2,
      name.name_address_line_3,
      name.name_address_line_4,
      name.name_address_line_5,
      name.name_address_line_6,
      name.name_address_line_7,
      name.name_address_city, 
      name.state_code,
      name.address_country_code, 
      name.zip_code, 
      name.tax_id_number,
      p1.output_tx_number_prin,
      p1.output_tx_number_int,
      '' as "transaction_number",
      p1header.check_account_number

    from 
    p1
    left join name on p1.name_address_number = name.name_address_number
    left join p1header on p1.issue_number = p1header.issue_number

  UNION ALL

  select 
      check.date_of_payment,
      check.media_number, 
      check.payment_amount,
      check.issue_number,
      check.payee_na_number,
      name.name_address_line_1,
      name.name_address_line_2,
      name.name_address_line_3,
      name.name_address_line_4,
      name.name_address_line_5,
      name.name_address_line_6,
      name.name_address_line_7,
      name.name_address_city, 
      name.state_code,
      name.address_country_code, 
      name.zip_code, 
      name.tax_id_number,
      '' as "output_tx_number_prin",
      '' as "output_tx_number_int",
      check.transaction_number,
      check.dda_number as "check_account_number"
  from check
  left join name on check.payee_na_number = name.name_address_number
) main_data

Selecting individual fields like above will give me an "invalid identifier error". If I do select * then it gives me back the data without any error. What am I doing wrong here? Thank you.

The old quoted identifier problem... see point 9 in the database object naming documentation , and note that Oracle does not recommend using quoted identifiers.

You've put your column alias as lower case inside double-quotes. That means that any references to it also have to be quoted and exactly match the case. So this would work:

select
  main_data.issue_number,
  main_data."transaction_number"
from
...

But unless you have a burning need to have that alias like that - and I doubt you do as all the identifier names from the actual table columns are not quoted - it would be simpler to remove the double quotes from the inner selects:

select
  main_data.issue_number,
  main_data.transaction_number
 from
 (
    select
  ...
      '' as transaction_number,
      p1header.check_account_number
  ...
  UNION ALL
  select 
    ...
      '' as output_tx_number_prin,
      '' as output_tx_number_int,
      check.transaction_number,
      check.dda_number as check_account_number
    ...

You don't actually need to alias the columns in the second branch of the union; the column identifiers will all be taken from the first branch.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM