Why FULL NATURAL JOIN works?

select * from v$version;
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
Why such constructions are successfully parsed and full/left/right/cross are ignored?
select * from
(select 1 a from dual)
full natural join
(select 2 a from dual);
select * from
(select 1 a from dual)
left natural join
(select 2 a from dual);
select * from
(select 1 a from dual)
right natural join
(select 2 a from dual);
select * from
(select 1 a from dual)
cross natural join
(select 2 a from dual);
The same time if we try to alias tables it gets an error:
select * from
(select 1 a from dual) t1
full natural join
(select 2 a from dual) t2;
ORA-00905: missing keyword
00905. 00000 - "missing keyword"
*Cause:   
*Action:
Error at Line: 29 Column: 5
Edited by: Slobodcicov on Nov 28, 2012 11:46 PM

Try this..
select * from
(select 1 a from dual) t1
natural full join
(select 2 a from dual) t2;A
2
1
Cheers,
Manik.

Similar Messages

  • A curious "anomoly" with the NATURAL JOIN  compared to the JOIN USING

    The following query returns what I expect from the HR schema [106 rows]:
    select last_name, department_name from employees JOIN departments USING (department_id);
    However, when I do the full natural join with this, I only get 32 rows.
    select last_name, department_name from employees  NATURAL JOIN departments;
    Is the full NATURAL JOIN not using DEPARTMENT_ID to join on? But if not what else would it use? I just ran into this and am mostly curious as I do not use the natural join syntax in production but instead prefer the JOIN ON.
    Thanks.

    Just expanding on user2361373's point a bit, the EMPLOYEES and DEPARTMENTS table both have a DEPARTMENT_ID column and both have a MANAGER_ID column. So the natural join will join on both columns.
    This is why the natural join is evil and ought never, ever, ever, ever, ever to be used in real production code. It violates fundamental tenants of building maintainable applications because it creates the potential that adding columns to an existing table will cause existing code to return incorrect results. If you decide that you need to add a CREATE_DATE column to a few tables, for example, to track when a row was inserted, suddenly, all your natural joins may decide that they need to add the CREATE_DATE to the list of columns to join on and your app starts behaving incorrectly. Or your initial DEPARTMENTS table doesn't have a MANAGER_ID column and you decide to add that later on-- all the existing natural joins between EMPLOYEE and DEPARTMENT start returning incorrect results.
    Justin

  • Since I joined creative cloud, I have not been able to sync. Why the difference? Worked good during initial trial. Also I had installed the Mosaic app before Lightroom mobile came out and I cannot seem to get rid of it. How can I get mosaic out? I have ca

    Since I joined creative cloud, I have not been able to sync. Why the difference? Worked good during initial trial.
    Also I had installed the Mosaic app for ipad before Lightroom mobile came out and I cannot seem to get rid of it. How can I get mosaic out? I have cancelled, I have deleted, I have looked through the files for visible remnants.

    The sync count is 60 and static. The total number synced so far is 500+. None have been synced from the ipad except for corrections made there on those already synced.
    I have deleted the Mosaic app from all machines and checked the library folder and have contacted the Mosaic tech support and they have discontinued my subscription. I still get mosaic messages on initiating Lightroom and sometimes at closing.
    I have not tried to sync fewer yet, but some catalogs that I have tried are smaller numbers. Initially, it did well on good connections. Nothing works on my home connections over satellite.

  • A simple problem with natural join

    i have 2 tables what have columns with distinct's names are referenced.
    natural join not works 'cose only foreign key reference this 2 tables.
    Have something to make table join in using an specific foreign key??
    I'm using oracle9i
    Example:
    table a( a_cod number, a_name varchar2(20))
    table b( b_cod number, b_month_year date, b_salary number)
    ALTER TABLE b ADD ( CONSTRAINT b_a_FK FOREIGN KEY (b_cod)
    REFERENCES a (a_cod));
    select * from a natural join b
    where trunc(b_month_year) = trunc(sysdate)

    I'm not express me correctly.
    We have 2 tables like this:
    CREATE TABLE PPTBA001
      PPA001_GROUP             NUMBER(3)            NOT NULL,
      PPA001_PEOPLECODE        VARCHAR2(20 BYTE)    NOT NULL,
      PPA001_NAME              VARCHAR2(60 BYTE)    NOT NULL,
      PPA001_DATEOFBIRTHDAY    DATE                 NOT NULL);
    CREATE TABLE CLTBA001
      CLA001_GROUP            NUMBER(3)             NOT NULL,
      CLA001_CLIENTCODE       VARCHAR2(20 BYTE)     NOT NULL,
      CLA001_SITUATION        NUMBER(1)             DEFAULT 1);
    SELECT * FROM PPTBA001 NATURAL JOIN CLTBA001;
    ALTER TABLE CLTBA001 ADD (
      CONSTRAINT CLA001_PPAA001_FK1 FOREIGN KEY (CLA001_GROUP, CLA001_CLIENTCODE)
        REFERENCES PPTBA001 (OFA001_GROUP,OFA001_PEOPLECODE));
          the select returns without results. 'cose does not have columns like same name.
    Natural join use a columns with same name. I need something use an foreign key.
    Why?? Now i have a problem .. i need aggregate one more column in primary key
    and i need change all selects that have join with PPTBA001 and put manualy a new column.. if have a other possibility like natural join to using a foreign key to join the selects problems is so more easy to resolve.
    Message was edited by:
    jonas.lima

  • Full outer join unexpected results

    Warning, long message - I've searched the forums and found nothing similar. I've cut out as much as possible. We have been given the following schema to work with:
    CREATE TABLE CALLS (
    TRUNKIN VARCHAR2 (10),
    TRUNKOUT VARCHAR2 (10),
    DURATION FLOAT)
    Here is some test data:
    insert into calls values(null, 'a', 3);
    insert into calls values(null, 'a', 2);
    insert into calls values('a', null, 1);
    insert into calls values(null, 'a', 0);
    insert into calls values(null, 'a', 0);
    insert into calls values(null, 'a', 7);
    insert into calls values(null, null, 0);
    This is horribly unnormalized, but basically this table represent phone calls. trunkin and trunkout represent the two ends, and duration is length of a call. While obviously every call has two ends, the nulls above represent ends we don't care about in this example.
    The goal is to end up with data that looks like this. In English, we want the in and out summary statistics for each trunk to be summarized into a single row. (Sorry, these are supposed to be columns, but they got wrapped, so I reposted them as rows):
    TRUNKIN a
    IN_CALLS_ATTEMPTED 1
    IN_CALLS_COMPLETED 1
    IN_AVERAGE_DURATION 1
    TRUNKOUT a
    OUT_CALLS_ATTEMPTED 5
    OUT_CALLS_COMPLETED 3
    OUT_AVERAGE_DURATION 4
    Indeed, with the data given above, these are the results returned with the query at the end of this message. However, when I changed the one non-null trunkin value to null, I got very strange results. First, I independently ran the two subqueries. The first of course returns no rows, the second returns 1 with the same out values above; this is exactly what I would expect. However, when I run the full query, I get **5** rows back, each with just the trunkout column set to "a" and **all** other columns set to null. This makes no sense to me. The 5 rows are obviously the 5 rows from the original data set where trunkout = "a", but I'm not full outer joining those; I'm full outer joining the result of the group by, which only has 1 row. But even given that I'm getting 5 rows back, shouldn't all five of those have the remaining out columns filled in with the values above?
    Here is the query:
    select
    from
    SELECT
    trunkin as trunk,
    COUNT(*) AS in_calls_attempted,
    SUM
    CASE
    WHEN duration > 0 THEN 1
    ELSE 0
    END
    ) AS in_calls_completed,
    SUM(duration)/
    SUM
    CASE
    WHEN duration > 0 THEN 1
    ELSE 0
    END
    ) AS in_average_duration
    FROM CALLS
    WHERE trunkin IS NOT NULL
    GROUP BY trunkin
    ) callsin
    full outer join
    SELECT
    trunkout as trunk,
    COUNT(*) AS out_calls_attempted,
    SUM
    CASE
    WHEN duration > 0 THEN 1
    ELSE 0
    END
    ) AS out_calls_completed,
    SUM(duration)/
    SUM
    CASE
    WHEN duration > 0 THEN 1
    ELSE 0
    END
    ) AS out_average_duration
    FROM CALLS
    WHERE trunkout IS NOT NULL
    GROUP BY trunkout
    ) callsout
    on callsin.trunk = callsout.trunk;

    I am not entirely sure why you are getting the results you are, but I strongly suspect that it is a result of outer joining on null columns. I would write the query as follows to avoid the outer join problem. The CASE statements in the outer query around the average duration calulations avoid the divide by zero error that would occur when some trunk has only in or out calls.
    SELECT trunk,SUM(in_calls_attempted) in_calls_attempted,
           SUM(in_calls_completed) in_calls_completed,
           CASE WHEN SUM(in_calls_completed) <> 0 THEN
                SUM(in_duration)/SUM(in_calls_completed)
                ELSE 0 END ave_in_duration,
           SUM(out_calls_attempted) out_calls_attempted,
           SUM(out_calls_completed) out_calls_completed,
           CASE WHEN SUM(out_calls_completed) <> 0 THEN
                SUM(out_duration)/SUM(out_calls_completed)
                ELSE 0 END ave_out_duration
    FROM (
       SELECT trunkin trunk,COUNT(*) in_calls_attempted,
              SUM(CASE WHEN duration > 0 THEN 1 ELSE 0 END) in_calls_completed,
              SUM(duration) in_duration,0 out_calls_attempted,
              0 out_calls_completed,0 out_duration
       FROM calls
       GROUP BY trunkin
       UNION ALL
       SELECT trunkout trunk,0 in_calls_attempted,0 in_calls_completed,
              0 in_duration,COUNT(*) out_calls_attempted,
              SUM(CASE WHEN duration > 0 THEN 1 ELSE 0 END) out_calls_completed,
              SUM(duration) out_duration
       FROM calls
       GROUP BY trunkout)
    GROUP BY trunkTTFN
    John

  • Granting SELECT to user on VIEW with FULL OUTER JOIN fails?

    I have a quandary.
    Using Oracle 9i, I have created a simple view. When I perform a count on it, rows are returned.
    However, when I grant SELECT access to another user, they can't see the VIEW. The VIEW has a FULL OUTER JOIN operation in it.
    When I do the same thing using a regular join, it works.
    Any ideas why, please?
    SQL> conn ifsinfo/******@DB
    Connected.
    SQL> ed
    Wrote file afiedt.buf
      1  create view mctest3 as
      2  select
      3   vc.idcus ,
      4   ci.customer_id
      5  from
      6   ifsapp.vmo_company vc
      7  full outer join
      8   ifsapp.customer_info ci
      9  on
    10*  vc.custno = ci.customer_id
    SQL> /
    View created.
    SQL> select count(*) from mctest3;
      COUNT(*)
         73994
    SQL> GRANT SELECT ON MCTEST3 TO IFSAPP WITH GRANT OPTION;
    Grant succeeded.
    SQL> CONN IFSAPP/******@DB
    Connected.
    SQL> select count(*) from IFSINFO.MCTEST3;
    select count(*) from IFSINFO.MCTEST3
    ERROR at line 1:
    ORA-00942: table or view does not existbut with regular join:
    SQL> conn ifsinfo/******@DB
    Connected.
    SQL> create view mctest4 as
      2    select
      3     vc.idcus ,
      4     ci.customer_id
      5    from
      6     ifsapp.vmo_company vc, ifsapp.customer_info ci
      7    where vc.custno = ci.customer_id;
    View created.
    SQL> select count(*) from mctest4;
      COUNT(*)
         44269
    SQL> GRANT SELECT ON MCTEST4 TO IFSAPP WITH GRANT OPTION;
    Grant succeeded.
    SQL> conn ifsapp/******@DB
    Connected.
    SQL> select count(*) from IFSINFO.MCTEST4;
      COUNT(*)
         44269

    Hi,
    >>SQL> conn ifsinfo/******@DB
    Connected.
    SQL> ed
    Wrote file afiedt.buf
    1 create view mctest3 as
    2 select
    3 vc.idcus ,
    4 ci.customer_id
    5 from
    6 ifsapp.vmo_company vc
    7 full outer join
    8 ifsapp.customer_info ci
    9 on
    10* vc.custno = ci.customer_id
    SQL> /
    According to Note:244315.1, it is not possible to make a FULL OUTER JOIN on views owned by another user at the 9i version of Oracle. As above, do not use FULL OUTER JOIN on views owned by another user. Try to use outer join operator (+), and/or UNIONS instead.
    Cheers

  • Ora-22905:cannot access rows from a non-nested ...(during full outer join)

    Greetings Gurus,
    I'm getting an ORA-22905 when I try and do a full outer join in the following function. If I include the commented lines in the perstren_diff_recs2 function I get the error. Both halfs of the union query work by themselves. When I union them bam error. Also, when I use the full outer join syntax the Oracle session craps the bed with a end of file communication error. That is why I'm using the simulated full outer join.
    My goal was to abstract the XML in my queries. The results from the pipelined function is a delta between what is in the XML document and a relational base table.
    Derrick
    CREATE OR REPLACE PACKAGE XML_UTILS is
    TYPE perstren_typ is record (
    uic varchar2(6),
    tpers varchar2(2),
    deply varchar2(6),
    secur varchar2(1),
    struc number(4),
    auth number(4)
    TYPE perstren_diff_typ is record (
    uic           varchar2(6),
    transaction_type char(1),
    tpers           varchar2(2),
    deply           varchar2(6),
    secur           varchar2(1),
    struc           number(4),
    auth           number(4)
    TYPE perstrenSet is table of perstren_typ;
    TYPE perstrenDiffSet is table of perstren_diff_typ;
    function perstren_recs (uic varchar2) return perstrenSet pipelined;
    function perstren_diff_recs2 (uic varchar2) return perstrenDiffSet pipelined;
    end;
    CREATE OR REPLACE PACKAGE BODY XML_UTILS is
    function perstren_diff_recs2 (uic varchar2) return perstrenDiffSet pipelined is
    cursor perstren_recs_cur(in_uic varchar2) is
    select p.uic, p.tpers, p.deply, P.secur, p.struc,p.auth,
    doc.uic as xmluic,
    doc.tpers as xmltpers,
    doc.deply as xmldeply,
    doc.secur as xmlsecur,
    doc.struc as xmlstruc,
    doc.auth as xmlauth
    from perstren_bac p left outer join
    table(xml_utils.perstren_recs(in_uic)) doc
    on (p.uic = doc.uic and
    p.tpers = doc.tpers and
    p.deply = doc.deply)
    where p.uic = in_uic;
    -- union
    -- select p.uic, p.tpers, p.deply, P.secur, p.struc,p.auth,
    -- doc.uic as xmluic,
    -- doc.tpers as xmltpers,
    -- doc.deply as xmldeply,
    -- doc.secur as xmlsecur,
    -- doc.struc as xmlstruc,
    -- doc.auth as xmlauth
    -- from perstren_bac p right outer join
    -- table(xml_utils.perstren_recs(in_uic)) doc
    -- on (p.uic = doc.uic and
    -- p.tpers = doc.tpers and
    -- p.deply = doc.deply)
    -- where doc.uic = in_uic;
    out_rec perstren_diff_typ;
    begin
    for cur_rec in perstren_recs_cur(uic) loop
    if cur_rec.xmldeply is not null and cur_rec.xmltpers is not null then
    out_rec.uic := cur_rec.xmluic;
    out_rec.tpers := cur_rec.xmltpers;
    out_rec.deply := cur_rec.xmldeply;
    out_rec.secur := cur_rec.xmlsecur;
    out_rec.struc := cur_rec.xmlstruc;
    out_rec.auth := cur_rec.xmlauth;
    else
    out_rec.uic := cur_rec.uic;
    out_rec.tpers := cur_rec.tpers;
    out_rec.deply := cur_rec.deply;
    out_rec.secur := cur_rec.secur;
    out_rec.struc := cur_rec.struc;
    out_rec.auth := cur_rec.auth;
    end if;
    if cur_rec.uic is not null and cur_rec.xmldeply is not null and cur_rec.xmltpers is not null and (
    nvl(cur_rec.secur,'XX') != nvl(cur_rec.xmlsecur,'XX') or
    nvl(cur_rec.struc,9999) != nvl(cur_rec.xmlstruc,9999) or
    nvl(cur_rec.auth,9999) != nvl(cur_rec.xmlauth,9999)) then
    out_rec.transaction_type :='U';
    elsif cur_rec.uic is null and cur_rec.xmldeply is not null then
    out_rec.transaction_type :='I';
    elsif cur_rec.uic is not null and cur_rec.xmldeply is null then
    out_rec.transaction_type :='D';
    else
    out_rec.transaction_type :='O';
    end if;
    PIPE row (out_rec);
    end loop;
    exception
    when others then
    if perstren_recs_cur%isopen then
    close perstren_recs_cur;
    end if;
    raise;
    return;
    end;
    function perstren_recs (uic varchar2) return perstrenSet pipelined is
    cursor perstren_recs_cur(in_uic varchar2) is
    select uic,
    extractvalue(Column_value,'/PERSTREN/TPERS') as TPERS,
    extractvalue(Column_value,'/PERSTREN/DEPLY') as DEPLY,
    extractvalue(Column_value,'/PERSTREN/SECUR') as SECUR,
    extractvalue(Column_value,'/PERSTREN/STRUC') as STRUC,
    extractvalue(Column_value,'/PERSTREN/AUTH') as AUTH
    from test_ref ref,
    table(XMLSequence(extract(ref.XML_DOC,'/RasDataSet/PerstrenList/PERSTREN'))) per
    where ref.uic = in_uic;
    out_rec perstren_typ;
    begin
    open perstren_recs_cur(uic);
    loop
    fetch perstren_recs_cur into out_rec;
    exit when not perstren_recs_cur%FOUND;
    PIPE row (out_rec);
    end loop;
    close perstren_recs_cur;
    exception
    when others then
    if perstren_recs_cur%isopen then
    close perstren_recs_cur;
    end if;
    raise;
    return;
    end;
    end;

    Oracle bug when executing the query in a function

  • Full outer Join:ORA-01790

    Hi All,
    The issue may be silly, but we cant make it out:
        DB : Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProdWe are running the below query with no issues:
    select t1.text,t2.text text2,t1.line,decode(upper(t1.text),upper(t2.text),1,0) flg
    from
       (select text,row_number() over(order by line) line
        from user_source
       where name = 'COLL_MVIEW_REFRESH_PROC_LBK'
       and replace(trim(text),chr(10)) is not null
       ) t1,
       (select text ,row_number() over(order by line) line
        from user_source
        where name = 'COLL_MVIEW_REFRESH_PROC'
        and trim(replace(text,chr(10))) is not null) t2
    where t1.line = t2.lineBut when trying for an outer join it is giving error like
    ORA-01790: expression must have same datatype as corresponding expressionOuter Join Query:
    select t1.text,t2.text,t1.line,decode(upper(t1.text),upper(t2.text),1,0) flg
    from
       (select text,row_number() over(order by line) line
        from user_source
        where name = 'COLL_MVIEW_REFRESH_PROC_LBK'
        and replace(trim(text),chr(10)) is not null
        ) t1 full outer join
        (select text ,row_number() over(order by line) line
        from user_source
        where name = 'COLL_MVIEW_REFRESH_PROC'
        and trim(replace(text,chr(10))) is not null) t2
    on( t1.line = t2.line )Any idea what is wrong here?
    Thanks,
    Jeneesh

    Not sure what is wrong with your version. It might have to do with row_number not working on an empty row (outer joined).
    How about this alternative?
    The approach is a bit different, but it uses only one access to the user_source view.
    select s.lineNo, min(s.text1) text1, min(s.text2) text2, decode(upper(min(s.text1)), upper(min(s.text2)), 1, 0) flag
    from
    (select decode(u.name, 'COLL_MVIEW_REFRESH_PROC_LBK', u.text) text1
           ,decode(u.name, 'COLL_MVIEW_REFRESH_PROC'
    , u.text) text2
           ,u.name,
            row_number() over (partition by u.name order by u.line) lineNo
    from user_source u
    where u.name in ('COLL_MVIEW_REFRESH_PROC_LBK','COLL_MVIEW_REFRESH_PROC'
    /* and u.TYPE = 'PROCEDURE' */
    and replace(trim(u.text),chr(10)) is not null
    ) s
    group by s.lineNo
    order by s.lineNo;Edited by: Sven W. on Nov 18, 2008 5:24 PM

  • FULL OUTER JOIN In InfoSet

    Hi, all
    Is it possible to make FULL OUTER JOIN in BI InfoSet?
    If no, another question - is it possible to switch base InfoProvider? I have an InfoSet with InfoCube1 and DSO1 which I can outer join. I want to outer join InfoCube1 , not DSO1 that's why I need to switch them in the InfoSet.

    Hi,
       In BI 7.0 Infoset has given chance to include an Info cube also,maximum you can include 2 info Cubes only in a infoset.
    check the below link which helps you in understanding of the join conditions so that you can apply to your scenario.
    http://help.sap.com/saphelp_nw2004s/helpdata/en/f1/713c3b35703079e10000000a114084/content.htm
    http://help.sap.com/saphelp_nw2004s/helpdata/en/67/7e4b3eaf72561ee10000000a114084/content.htm
    Regards,
    Praveena.

  • Full outer join ---  bug? Urgent

    Hi,
    I have a simple mapping using 2 source tables and doing an full outer join. While executing the mapping it is throwing me out with an error --
    Starting Execution LOAD_SAP
    Starting Task LOAD_SAP
    ORA-01790: expression must have same datatype as corresponding expression
    ORA-02063: preceding line from ODSD@LOC_TGT_LOC_ODSD
    ORA-06512: at "DWH_USER.LOAD_SAP", line 12
    ORA-06512: at "DWH_USER.LOAD_SAP", line 481
    ORA-06512: at "DWH_USER.LOAD_SAP", line 795
    ORA-06512: at "DWH_USER.LOAD_SAP", line 1973
    ORA-06512: at line 1
    Completing Task LOAD_SAP
    Completing Execution LOAD_SAP
    The SQL generated at line 12 is -
    CURSOR "JOIN_c" IS
    SELECT
    /*+ DRIVING_SITE("CONNECTION_LOC_TGT_LOC_ODSD") */
    "CONNECTION_LOC_TGT_LOC_ODSD"."END_USER_CUST_ID" "END_USER_CUST_ID",
    "SERVICE_LOC_TGT_LOC_ODSD"."SERVICE_NAME" "SERVICE_NAME",
    "CONNECTION_LOC_TGT_LOC_ODSD"."CE_CLLI" "CE_CLLI",
    "CONNECTION_LOC_TGT_LOC_ODSD"."PE_CLLI" "PE_CLLI"
    FROM "ODS"."CONNECTION"@"ODSD"@"LOC_TGT_LOC_ODSD" "CONNECTION_LOC_TGT_LOC_ODSD"
    FULL OUTER JOIN "ODS"."SERVICE"@"ODSD"@"LOC_TGT_LOC_ODSD" "SERVICE_LOC_TGT_LOC_ODSD" ON ("CONNECTION_LOC_TGT_LOC_ODSD"."END_USER_CUST_ID" = "SERVICE_LOC_TGT_LOC_ODSD"."END_USER_CUST_ID") ;
    If I replace the Full outer join with an equi join everything works fine. The SQL generated with an equi-join is ---
    SELECT
    /*+ DRIVING_SITE("CONNECTION_LOC_TGT_LOC_ODSD") */
    "CONNECTION_LOC_TGT_LOC_ODSD"."END_USER_CUST_ID" "END_USER_CUST_ID",
    "SERVICE_LOC_TGT_LOC_ODSD"."SERVICE_NAME" "SERVICE_NAME",
    "CONNECTION_LOC_TGT_LOC_ODSD"."CE_CLLI" "CE_CLLI",
    "CONNECTION_LOC_TGT_LOC_ODSD"."PE_CLLI" "PE_CLLI"
    FROM "ODS"."CONNECTION"@"ODSD"@"LOC_TGT_LOC_ODSD" "CONNECTION_LOC_TGT_LOC_ODSD",
    "ODS"."SERVICE"@"ODSD"@"LOC_TGT_LOC_ODSD" "SERVICE_LOC_TGT_LOC_ODSD" WHERE ( "CONNECTION_LOC_TGT_LOC_ODSD"."END_USER_CUST_ID" = "SERVICE_LOC_TGT_LOC_ODSD"."END_USER_CUST_ID" );
    We are using Oracle 9.2.0.4 AND OWB Clinet 9.2.0.2.8 and runtime repository 9.2.0.2.0.
    Any help on this appreciated?

    The discussion on this thread has moved to the later thread Problem with JOINs
    Nikolai

  • Using full outer join of subqueries named using with clause

    Hi,
    I am trying to create a view which is having 2 subqueries vol1 & vol2 with WITH clause. I am joining those 2 subqueries in the main query with FULL OUTER JOIN.
    When i compile that view in a tool like pl/sql developer, It has been compiled successfully.
    But when i call the view creation script from SQL command prompt, It is throwing error as
    from vol1 FULL JOIN vol2 o ON (vol1.ct_reference = vol2.ct_reference and vol1.table_name = vol2.table_name
    ERROR at line 29:
    ORA-00942: table or view does not exist
    Kindly advise whats going wrong.

    that's line 29. Maybe you get a better idea if you strip your operation of all the unneccessary elements until it works.
    There are some known bugs with subquery factoring (aka with clause) and also with ANSI join syntax, but it is hard to tell what happens here based on your description. But one thing is strange - if it is not a result of formatting (not formatting): I would expect the asterisk beneath the unknown table and not beneath the key word FULL.
    P.S.: my editor makes me think it's rather a proportional font thing. Have I already said that I don't like proportional font for SQL code examples?

  • Union among multiple select queries with full outer join

    Hello everyone,
    I have 3 different select queries (used FULL Outer Join) which work fine. Now I want to add Union to the results among them and pick the selected columns from each query in the final result. while doing so, I am getting an error as "right parenthesis missing". I am quite sure, it is not the real cause. I guess might be issue with the query structure.
    select j.pod, j.hostname, portal.hostname,saasc.hostname,a3s.hostname from -- * from
    Select J.Pod,J.Hostname, P.Pod Portal_Pod,P.Hostname Portal_Hostname
    From Total_Pod J
    full outer join Portal_Tmp P On (J.Pod = P.Pod And J.Hostname = P.Hostname) as portal
    Union
    Select J.Pod,J.Hostname, s.Pod saasc_Pod,s.Hostname saasc_Hostname
    From Total_Pod J
    full outer join Saasc_Tmp S  On (J.Pod = s.Pod And J.Hostname = s.Hostname) as saasc
    Union
    Select J.Pod,J.Hostname, a.Pod a3s_Pod,a.Hostname a3s_Hostname
    From Total_Pod J
    Full Outer Join A3s_Tmp A  On (J.Pod = A.Pod And J.Hostname = A.Hostname) as a3s
    )p.s: select * from (INNER QUERY); also does not work.
    Any help appreciated.
    Thanks in advance.

    With T as
    (Select J.Pod,J.Hostname, P.Pod Portal_Pod,P.Hostname Portal_Hostname
    From Total_Pod J
    full outer join Portal_Tmp P On (J.Pod = P.Pod And J.Hostname = P.Hostname) ),
    U as
    (Select J.Pod,J.Hostname, s.Pod saasc_Pod,s.Hostname saasc_Hostname
    From Total_Pod J
    full outer join Saasc_Tmp S  On (J.Pod = s.Pod And J.Hostname = s.Hostname) ),
    V as
    (Select J.Pod,J.Hostname, a.Pod a3s_Pod,a.Hostname a3s_Hostname
    From Total_Pod J
    Full Outer Join A3s_Tmp A  On (J.Pod = A.Pod And J.Hostname = A.Hostname) )
    Select T.Pod,T.Hostname,nvl(T.Portal_Hostname,'Not Available') portal,nvl(U.Saasc_Hostname,'Not Available') saasc,NVL(V.A3s_Hostname,'Not Available') a3s From T,U,V
    Where T.Pod = U.Pod
    And U.Pod = V.Pod
    And T.Hostname = U.Hostname
    And U.Hostname = V.Hostname

  • Strange bug with Full Outer Join

    Hi guys,
    can you please confirm this behaviour on 11gR2? It used to work fine on 10gR1.
    Small test case:
    create table TEST_OBJECT_METADATA
      project_name  VARCHAR2(30 CHAR) not null,
      object_id     NUMBER not null
    create table TEST_OBJECT_INFO
      object_id          NUMBER not null,
      object_type        VARCHAR2(30) not null
    create table TEST_SUPPORTED_OBJECTS
      object_type    VARCHAR2(30 CHAR) not null,
      enabled        NUMBER(1));
    INSERT INTO TEST_OBJECT_METADATA VALUES ('NEW',1);
    INSERT INTO TEST_OBJECT_INFO VALUES (1, 'TABLE');
    INSERT INTO TEST_SUPPORTED_OBJECTS VALUES ('TABLE',1);
    COMMIT;When I execute the following query:
    WITH old_project AS
    (SELECT oi.object_type,
             oi.object_id
        FROM test_object_metadata om,
             test_object_info     oi
       WHERE om.object_id = oi.object_id
         AND project_name = 'OLD'),
    new_project AS
    (SELECT oi.object_type,
             oi.object_id
        FROM test_object_metadata om,
             test_object_info     oi
       WHERE om.object_id = oi.object_id
         AND project_name = 'NEW')
    SELECT src.object_type,
               t.enabled
      FROM (SELECT nvl(o.object_type, n.object_type) object_type
              FROM old_project o
              FULL OUTER JOIN new_project n
                ON o.object_id = n.object_id) src,
           test_supported_objects t
    WHERE src.object_type = t.object_type(+);I get the following output:
    OBJECT_TYPE     ENABLED
    TABLE             So, the outer join to test_supported_objects does not match.
    But if I force the FULL OUTER JOIN to run first using rownum:
    WITH old_project AS
    (SELECT oi.object_type,
             oi.object_id
        FROM test_object_metadata om,
             test_object_info     oi
       WHERE om.object_id = oi.object_id
         AND project_name = 'OLD'),
    new_project AS
    (SELECT oi.object_type,
             oi.object_id
        FROM test_object_metadata om,
             test_object_info     oi
       WHERE om.object_id = oi.object_id
         AND project_name = 'NEW')
    SELECT src.object_type,
               t.enabled
      FROM (SELECT nvl(o.object_type, n.object_type) object_type,
                           rownum
              FROM old_project o
              FULL OUTER JOIN new_project n
                ON o.object_id = n.object_id) src,
           test_supported_objects t
    WHERE src.object_type = t.object_type(+);I get the expected output:
    OBJECT_TYPE     ENABLED
    TABLE             1 Thanks in advance.

    Without mixing works fine:
    WITH old_project AS
    (SELECT oi.object_type,
             oi.object_id
        FROM test_object_metadata om,
             test_object_info     oi
       WHERE om.object_id = oi.object_id
         AND project_name = 'OLD'),
    new_project AS
    (SELECT oi.object_type,
             oi.object_id
        FROM test_object_metadata om,
             test_object_info     oi
       WHERE om.object_id = oi.object_id
         AND project_name = 'NEW')
    SELECT src.object_type,
           t.enabled
      FROM (SELECT nvl(o.object_type, n.object_type) object_type
              FROM old_project o,
                   new_project n   
              where  o.object_id = n.object_id(+)
              UNION
              SELECT nvl(o.object_type, n.object_type) object_type
              FROM old_project o,
                   new_project n   
              where  o.object_id(+) = n.object_id) src,
           test_supported_objects t
    WHERE src.object_type = t.object_type(+);but there shouldn't be any restrictions on mixing them, right?

  • Full Outer Join Help please

    Using : Oracle 11.2.0.1 on Windows XP
    create table tab40(bno varchar2(1),pno varchar2(7),weight number(3),lineno number(3));
    insert into tab40 values ('1','1115027',36,1);
    insert into tab40 values ('2','1115100',25,2);
    insert into tab40 values ('3','1115200',50,3);
    insert into tab40 values ('1','1112510',60,4);
    insert into tab40 values ('+','1112610',6,5);
    insert into tab40 values ('+','1112710',4,6);
    insert into tab40 values ('+','1110710',1,7);
    insert into tab40 values ('2','1117014',79,8);
    insert into tab40 values ('+','1117000',9,9);
    insert into tab40 values ('+','1117001',2,10);
    insert into tab40 values ('1','1317001',200,11);
    insert into tab40 values ('1','1697001',20,12);
    insert into tab40 values ('2','2997001',40,13);
    insert into tab40 values ('1','2996001',44,14);
    SQL> select * from tab40;
    B PNO         WEIGHT     LINENO
    1 1115027         36          1
    2 1115100         25          2
    3 1115200         50          3
    1 1112510         60          4
    + 1112610          6          5
    + 1112710          4          6
    + 1110710          1          7
    2 1117014         79          8
    + 1117000          9          9
    + 1117001          2         10
    1 1317001        200         11
    B PNO         WEIGHT     LINENO
    1 1697001         20         12
    2 2997001         40         13
    1 2996001         44         14
    14 rows selected.
    SQL>create table tab41(bno varchar2(1),pno varchar2(7),weight number(3),lineno number(3));
    insert into tab41 values ('1','1115027',36,1);
    insert into tab41 values ('2','1115100',25,2);
    insert into tab41 values ('3','1115200',50,3);
    insert into tab41 values ('1','1112510',60,4);
    insert into tab41 values ('+','1112610',6,5);
    insert into tab41 values ('+','1110710',1,6);
    insert into tab41 values ('2','1117014',79,7);
    insert into tab41 values ('+','1117000',9,8);
    insert into tab41 values ('1','1317001',200,9);
    insert into tab41 values ('1','1697001',20,10);
    insert into tab41 values ('2','2997001',40,11);
    insert into tab41 values ('1','2996001',44,12);
    insert into tab41 values ('+','1112710',4,13);
    insert into tab41 values ('+','3332710',8,14);
    SQL> select * from tab41;
    B PNO         WEIGHT     LINENO
    1 1115027         36          1
    2 1115100         25          2
    3 1115200         50          3
    1 1112510         60          4
    + 1112610          6          5
    + 1110710          1          6
    2 1117014         79          7
    + 1117000          9          8
    1 1317001        200          9
    1 1697001         20         10
    2 2997001         40         11
    B PNO         WEIGHT     LINENO
    1 2996001         44         12
    + 1112710          4         13
    + 3332710          8         14
    14 rows selected.
    SQL>Required Output :
    A       B          C          D        E       F          G          H
    1 1112510         60          4        1 2996001         44         12
    + 1112710          4          6        + 1112710          4         13
    2 1117014         79          8
    + 1117001          2         10
                                           1 2996001         44         12
                                           + 3332710          8         14Logic : The plus sign in Bno indicates that Packet No. was sent to customer with last non plus signed number packet (order by lineno) i.e. for example in tab40 there is line no. 6 whose master packet number is 1112510 (previous non plus signed rows's PNO). Now come to required output; which is showing that these plus signed packets (whose master PNO is that) are not as per tab40 vs tab41 something like full outer join between tab40 and tab41. Example :
    + 1112710 is associated with 1112510 in tab40, while in tab41 it is associated with 2996001; so it is difference.
    + 1117001 is associated with 1117014 in tab40, while it is not in tab41.
    vice versa;
    + 3332710 is associated with 2996001 in tab41, while it is not in tab40.
    I mean, if only plus marked row's PNO's mater packet number is not equal to master PNO(previous non plus marked BNO) in both the table, it should be part of the select query please. Generally this happens, when our packing department gets late delivery of prior master packet, so they just send the small packet with immediate available one (non plus) packet.
    Kindly let me; i am clear in my request or i should elaborate more. This may be more complex, because may be bad table/data design, but i need the output by select query please help me.
    Regards.
    Edited by: user12050217 on Jan 3, 2012 3:57 AM

    Yes, you have perfectly understood my question... just i added lineno > 1
    SELECT bno,
    pno,
    weight,
    lineno
    FROM ( SELECT tab40.*, lag (bno) OVER (ORDER BY pno) prev_bno
    FROM tab40
    ORDER BY pno)
    WHERE bno = '+' OR prev_bno = '+' and lineno > 1
    ORDER BY lineno
    and it worked, because there are no chances that plus marked row will be having lineno <=1
    B PNO         WEIGHT     LINENO
    1 1112510         60          4
    + 1112610          6          5
    + 1112710          4          6
    + 1110710          1          7
    2 1117014         79          8
    + 1117000          9          9
    + 1117001          2         10
    7 rows selected.

  • Full Outter Join

    I have the following PL/SQL that insert into the table ag_comm_statement from 3 data sets, a, b and c. May anybody know how to make a full outter joins for data set a and c (See the section in bold below)? Many thanks in advance.
    insert into ag_comm_statement
    ( month_key
    ,commission_no
    ,comm_cutoff_date
    ,branch_code
    ,branch_name
    -- DW001 Old Start
    -- ,product_category
    -- DW001 Old End
    -- DW001 New Start
    -- ,product_desc
    -- DW001 New End
    ,product_name
    ,payment_mode
    ,fy_no_of_policy
    ,fy_annualised_premium
    ,fy_commission_premium
    ,fy_commission
    ,renew_no_of_policy
    ,renew_commission_premium
    ,renew_commission
    select v_month_key
    ,v_commission_no
    ,v_comm_cutoff_date
    ,a.branch_code
    ,a.branch_name
    -- DW001 Old Start
    -- ,decode(a.product_code,'0107000000','GRIP','0640000000','MISO') product_category
    -- DW001 Old End
    -- DW001 New Start
    -- ,pd.category_desc product_category
    -- ,pd.plan_code_desc product_desc
    -- DW001 New End
    ,b.basic_plan_code product_name
    ,decode(b.payment_mthd,'S','S',lpad(b.payment_mode,2,'0')) payment_mode
    ,count(distinct a.policy_no) fy_no_of_policy
    ,sum(b.afyp) fy_annualised_premium
    ,sum(a.premium) fy_commission_premium
    ,sum(a.fy_commission) fy_commission
    ,count(distinct c.policy_no) renew_no_of_policy
    ,sum(c.premium) renew_commission_premium
    ,sum(c.fy_commission) renew_commission
    from (select a.policy_no
    ,a.product_code
    ,b.branch_code
    ,b.branch_name
    ,sum(round((a.comm_orig_curr * c.spot_rate),2)) fy_commission
    ,sum(a.premium * c.spot_rate) premium
    -- DW001 New Start
    -- ,a.plan_code
    -- DW001 New End
    from dwh.ag_comm_work a
    ,dwh.agent_details@dhkp b
    ,dwh.ag_comm_exchange_rate c
    where a.branch_code = '82610'
    and a.run_date between v_prev_cutoff_date + 1
    and v_comm_cutoff_date
    and a.ptype in ('01','02','03','04','05','11','20')
    and a.reason_code in ('112','114','115')
    and a.agent_code = b.agent_code
    and a.currency = c.ais_code (+)
    and c.run_date = v_comm_cutoff_date
    group by
    a.policy_no
    ,a.product_code
    ,b.branch_code
    ,b.branch_name
    -- DW001 New Start
    -- ,a.plan_code
    -- DW001 New End
    ) a
    ,bis_weekly_data@chkp b
    -- DW001 New Start
    -- ,dwh.product_dim pd
    -- DW001 New End
    ,(select a.policy_no
    ,a.product_code
    ,b.branch_code
    ,b.branch_name
    ,sum(round((a.comm_orig_curr * c.spot_rate),2)) fy_commission
    ,sum(a.premium * c.spot_rate) premium
    from dwh.ag_comm_work a
    ,dwh.agent_details@dhkp b
    ,dwh.ag_comm_exchange_rate c
    where a.branch_code = '82610'
    and a.run_date between v_prev_cutoff_date + 1
    and v_comm_cutoff_date
    and a.ptype in ('01','02','03','04','05','11','20')
    and a.reason_code in ('131','132')
    and a.agent_code = b.agent_code
    and a.currency = c.ais_code (+)
    and c.run_date = v_comm_cutoff_date
    group by
    a.policy_no
    ,a.product_code
    ,b.branch_code
    ,b.branch_name
    ) c
    where a.policy_no = substr(b.contract_no (+),3, 7)
    and c.policy_no (+) = a.policy_no
    and c.branch_code (+) = a.branch_code
    and c.product_code (+) = a.product_code
    -- DW001 New Start
    -- and pd.plan_code = a.plan_code
    -- and pd.coverage_indicator = 'BASIC'
    -- and pd.level_col = 'DETAIL'
    -- DW001 New End
    group by
    a.branch_code
    ,a.branch_name
    ,a.product_code
    ,b.basic_plan_code
    ,b.payment_mode
    ,b.payment_mthd
    -- DW001 New Start
    -- ,pd.category_desc
    -- ,pd.plan_code_desc
    -- DW001 New End
    exception
    when others then
    dbms_output.put_line('insert data error!');
    rollback;
    raise;

    Hi psiplaw
    First of all yours query is too complex to understand ,why dont you create view for table c and then use full outer join??
    select e.empno,e.ename,d.deptno,d.dname,l.locid
    from emp e
    full outer join dept d on (e.deptno=d.deptno)
    full outer join location l on (d.locid=l.locid);
    any how have a look there
    http://asktom.oracle.com/pls/ask/f?p=4950:8:1563052620953158875::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:7350850093871
    Message was edited by:
    pcbyte12
    Message was edited by:
    pcbyte12

Maybe you are looking for

  • When I'm watching a movie on itunes, the video keeps messing up. How do I fix this?

    I'm trying to watch a movie on my itunes. My ipod isn't plugged in or anything, just itunes. But when it plays, the picture keeps freezing. The audio continues, but the scene just freezes and after a few seconds it catches up with the audio and it do

  • Regarding alv report edit

    hi could  u plz tell me  how to edit the values of the alv  grid display could u plz explain clearly with code

  • Why does my function not return anything when I create as a schema object

    I have user ABC who owns several tables some of which have foreign key constraints. I have user XYZ that has been granted access to all tables owned by user ABC. When I create a function as user XYZ using following I get no return when I issue: selec

  • Network two macs

    I have two new iMac's connected to a Time Machine via ethernet which is then connected to my Internet service.  I want to share files between the two machines without have to use a flash drive or whatever.  How?

  • Is JMS based solution the right one?

    Hello, I'm doing some research on possible solutions to a process that is currently being completed semi manually and semi automated. The process itself consists of feeding several thousand ID numbers to a legacy C++ application, which in turn, after