Outer join on OR operation alternate???

I have two tables stg and ads .I wanted to retreive all rows from stg table even if I dont find a match against ads
table on column cert but I need to check two matches against ads cert.One is with stg.cert and another with stg.cert1.
If outer join is possible with OR I would have used it. Can any one suggest a good solution other than using UNION? Thanks
Illegal :) syntax would be
    Select t1.c1,t1.c2,t2.a1,t2.a2 from
    stg t1,ads t2
    where (t1.cert=t2.cert(+) or t1.cert1=t2.cert(+));
    Thaks
Hena

Hi,
Oracle 8.1 was released in 1998. If you're using a 12-year-old version, that's pretty significant information, and it belongs in your first message.
Even if you're using a recent version of Oracle, it's helpful to say what that version is before people spend time giving you answers you can't use.
You might be able to do a UNION.
For example:
SELECT  t1.c1, t1.c2, t2.a1, t2.a2
FROM     stg    t1
,     ads    t2
WHERE     t2.cert  IN (t1.cert, t1.cert1)
    UNION ALL
SELECT  t3.c1, t3.c2, NULL, NULL
FROM     stg    t3
WHERE     NOT EXISTS (
                     SELECT  0
                 FROM    ads     t4
                 WHERE   t4.cert     IN (t3.cert, t3.cert1)
;Edited by: Frank Kulash on Oct 5, 2010 11:12 AM

Similar Messages

  • Outer join with IN operator

    Hi.
    I have two folders in Discoverer 10.1.2. These folder are joined with outer join on detail table:
    a.item1=b.item1(+)
    When I use both Folders in the worksheet and then add a condition for example
    b.item2 = 20, Discoverer generates SQL with the following conditions.
    a.item1=b.item1(+)
    b.item2 (+) = 20
    That's OK. The problem is that I need to use IN operator in the conditions, i.e. somethink like this:
    a.item1=b.item1(+)
    b.item2 (+) IN (20,30,40)
    This can be done in SQL using ANSI syntax:
    LEFT JOIN table b ON a.item1=b.item1, b.item2 IN (20,30,40)
    But I don't know how to achieve this in Discoverer Plus!
    (without using Custom folders in Administartor)
    Can anybody help, please?
    Thanks
    Jakub.

    Thanks for replies.
    blaplant:
    Yes, I need to report against a transaction database and I'm not allowed to change any table.
    Rod West:
    I know about the possibility of creating Custom folder as you suggest. Unfortunately our customer doesn't like this solution, because the condition "IN (20,30,40) " will be useful only for one user. Others wants differnet values in that condition.
    So using custom folder would mean to create many Custom folders in the EUL.
    However I like the idea of using session parameters.
    I'll try to create one Custom folder with session parameters. In the Plus there will be default value set on 20,30,40. So the current user can confirm this deafult value before the worksheet is run and future users can change parameters as they like.
    Moreover there could be another solution. Session parameters could be set directly by a calculation, maybe. So we can create a special worksheet for each user and no parameters in Plus will be necessary.
    Thanks for ideas.
    Jakub.

  • Sql help (left outer join)

    Hi All,
    I am referring 2 regular tables from the HR schema which you get when you install Oracle 9i , Now the issue is that I want all the rows from my employees table even if the row doesnt have the salary equal to 2500.
    Here is my Sql:
    select e.employee_id
         , e.first_name
         , e.last_name
         , e.salary
         , e.department_id e_dep_id
         , d.department_id d_dep_id
         , d.department_name
         , d.location_id
    from employees e
    , departments d
    where 1 = 1
         And e.department_id = d.department_id(+) And e.SALARY = 2500
    I am achieving my result set from the below query though(its just a syntactical problem) , please help :
    select e.employee_id
         , e.first_name
         , e.last_name
         , e.salary
         , e.department_id e_dep_id
         , d.department_id d_dep_id
         , d.department_name
         , d.location_id
    from employees e left outer join
    departments d
    on e.department_id = d.department_id And e.SALARY = 2500
    Regards
    Rahul

    Mac_Freak_Rahul wrote:
    Well my requirement is to pull all the records from my driving table(ie employees) doesnt matter weather the condition satisfies or not. Just to add to that lets say I would need to bring another table and my join criteria involves data from the employees table and the third table(in this case I need to make sure that all the rows from my driving table remains and doesnt get filter out). Please help my only problem is of the new syntax of outer joins.
    Regards
    RahulRahul,
    Why do you want to use "oracle only syntax ( + )"? I highly recommend you to use ANSI syntax, it's much more readable:
    This is from Oracle's documents:
    Oracle recommends that you use the FROM clause OUTER JOIN syntax rather than the Oracle join operator. Outer join queries that use the Oracle join operator (+) are subject to the following > rules and restrictions, which do not apply to the FROM clause OUTER JOIN syntax:
    You cannot specify the (+) operator in a query block that also contains FROM clause join syntax.
    The (+) operator can appear only in the WHERE clause or, in the context of left-correlation (that is, when specifying the TABLE clause) in the FROM clause, and can be applied only to a column > of a table or view.
    If A and B are joined by multiple join conditions, then you must use the (+) operator in all of these conditions. If you do not, then Oracle Database will return only the rows resulting from a > simple join, but without a warning or error to advise you that you do not have the results of an outer join.
    The (+) operator does not produce an outer join if you specify one table in the outer query and the other table in an inner query.
    You cannot use the (+) operator to outer-join a table to itself, although self joins are valid. For example, the following statement is not valid:
    -- The following statement is not valid:
    SELECT employee_id, manager_id
    FROM employees
    WHERE employees.manager_id(+) = employees.employee_id;
    However, the following self join is valid:
    SELECT e1.employee_id, e1.manager_id, e2.employee_id
    FROM employees e1, employees e2
    WHERE e1.manager_id(+) = e2.employee_id;
    The (+) operator can be applied only to a column, not to an arbitrary expression. However, an arbitrary expression can contain one or more columns marked with the (+) operator.
    A WHERE condition containing the (+) operator cannot be combined with another condition using the OR logical operator.
    A WHERE condition cannot use the IN comparison condition to compare a column marked with the (+) operator with an expression.
    A WHERE condition cannot compare any column marked with the (+) operator with a subquery.Best Regards,
    Gokhan
    If this question is answered, please mark appropriate posts as correct/helpful and the thread as closed. Thanks

  • Non-ANSI Outer Join Operator Issue (reposted due to text issues)

    I am currently using Designer 11.5.0.0. Itu2019s XI Rel 2, but Iu2019m not sure what service pack. I have created several universes with outer joins against a SQL Server 2005 database, but when I try using them in a Crystal report, I get the following error:
    Failed to retrieve date from the database. Details: 42000:[Microsoft][ODBC SQL Server Driver][SQL Server] The query uses non-ANSI outer join operators (u201C=u201D or u201C=u201D). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.
    Here is my ODBC DSN configuration:
    Microsoft SQL Server ODBC Driver Version 03.85.1132
    Data Source Name: FlexOPS
    Data Source Description:
    Server: dalsvrw031
    Database: (Default)
    Language: (Default)
    Translate Character
    Data: Yes
    Log Long Running Queries: No
    Log Driver Statistics: No
    Use Integrated Security: No
    Use Regional Settings: No
    Prepared Statements Option: Drop temporary procedures on disconnect
    Use Failover Server: No
    Use ANSI Quoted Identifiers: Yes
    Use ANSI Null, Paddings and Warnings: Yes
    Data Encryption: No
    Okay, so I understand what the issue is. It appears that the version of Designer that I am using does not default the ANSI92 parameter to u201CYesu201D. So all the outer joins I have created in each of my universe are using the old *= as the join operator. And apparently, the ODBC driver I am using is not very happy with that.
    As I understand it from what Iu2019ve read on other sites, I have the following options:
    1) Set the ANSI92 parameter to Yes, drop all my joins, close and re-open Designer, and recreate all of the joins.
    2) Find a different driver or connectivity method that will support non-ANSI joins.
    3) Set my database back to SQL 2000 compatibility.
    Option 1 is unappealing as it will cause a lot of time redoing all the work that Iu2019ve spent the past month doing. Option 2 is only a band-aid fix at best. Option 3 really isnu2019t an option for us.

    So I am wondering what other options I have to change these non-ANSI joins to ANSI compatible joins. Do I need to update Designer with a service pack? Is there a script out there that will automatically do this in each of the universes? I would appreciate any suggestions or guidance on this.
    Thanks,
    Lee

  • Non-ANSI Outer Join Operator Issue

    I am currently using Designer 11.5.0.0.  Itu2019s XI Rel 2, but Iu2019m not sure what service pack.  I have created several universes with outer joins against a SQL Server 2005 database, but when I try using them in a Crystal report, I get the following error:
    Failed to retrieve date from the database.
    Details:  42000:[Microsoft][ODBC SQL Server Driver][SQL Server] The query uses non-ANSI outer join operators (u201C=u201D or u201C=u201D).  To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel.  It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN).  In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.
    Here is my ODBC DSN configuration:
    Microsoft SQL Server ODBC Driver Version 03.85.1132
    Data Source Name: FlexOPS
    Data Source Description:
    Server: dalsvrw031
    Database: (Default)
    Language: (Default)
    Translate Character Data: Yes
    Log Long Running Queries: No
    Log Driver Statistics: No
    Use Integrated Security: No
    Use Regional Settings: No
    Prepared Statements Option: Drop temporary procedures on disconnect
    Use Failover Server: No
    Use ANSI Quoted Identifiers: Yes
    Use ANSI Null, Paddings and Warnings: Yes
    Data Encryption: No
    Okay, so I understand what the issue is.  It appears that the version of Designer that I am using does not default the ANSI92 parameter to u201CYesu201D.  So all the outer joins I have created in each of my universe are using the old *= as the join operator.  And apparently, the ODBC driver I am using is not very happy with that.
    As I understand it from what Iu2019ve read on other sites, I have the following options:
    1)   Set the ANSI92 parameter to Yes, drop all my joins, close and re-open Designer, and recreate all of the joins.
    2)   Find a different driver or connectivity method that will support non-ANSI joins.
    3)   Set my database back to SQL 2000 compatibility.
    Option 1 is unappealing as it will cause a lot of time redoing all the work that Iu2019ve spent the past month doing.  Option 2 is only a band-aid fix at best.  Option 3 really isnu2019t an option for us.
    So I am wondering what other options I have to change these non-ANSI joins to ANSI compatible joins.  Do I need to update Designer with a service pack?  Is there a script out there that will automatically do this in each of the universes?
    I would appreciate any suggestions or guidance on this.
    Thanks,
    Lee
    Edited by: Lee Vance on Jul 6, 2009 10:02 PM

    Hi,
    try the following:
    open your universe in the Universe designer, go to File->Parameter, select the Parameter tab and change the value of the ANSI92 parameter from No to Yes.
    Regards,
    Stratos

  • What is IS NULL doing in replacing NOT EXISTS operator with an outer join?

    DB version:10gR2
    An example from searchoracle.target.com
    The query which contains a NOT EXISTS operator
    SELECT M.ModulId, M.Modul FROM MODULE M
    WHERE NOT EXISTS
    ( SELECT PROJEKTMODUL.IdModul
      FROM PROJEKTMODUL
      WHERE M.ModulId = PROJEKTMODUL.IdModul
      AND PROJEKTMODUL.IdProjekt = 23 )is replaced by an equivalent outer join query
    select distinct
           M.ModulId
         , M.Modul
      from MODULE M
    left outer
      join PROJEKTMODUL
        on M.ModulId = PROJEKTMODUL.IdModul
       and PROJEKTMODUL.IdProjekt = 23
    where PROJEKTMODUL.IdProjekt is nullI don't understand what
    PROJEKTMODUL.IdProjekt is nullis doing in the above rewritten query.

    It is to perform an Anti-Join. As far as I know Oracle (starting with release 10g - I thought Release 1) rewrites your NOT EXISTS and NOT IN query to a Anti Join which looks like your second query.
    Look at the results of the query without the IS NULL predicate and see which records (from that set) should be selected to show the same results as the first query. The records of interest match the predicate IS NULL.

  • Outer Join problems - "ORA-30563 outer join operator (+) not allowed in select-list"

    Products: Discoverer 4.1.33.0.2
    (Admin and User/Plus)
    8i EE 8.1.7 (Discoverer server)
    8i EE 8.1.5 ('source data' server)
    Background assumptions: (1) If a column from an "outer-joined" table is compared to a constant, the outer join operator must be applied to that column in order for the outer join to work. (2) A 'Condition' specified in Discoverer User/Plus manifests as a comparison to a constant.
    I created a join in Admin between two folders, selected 'outer join on detail' option. In User/Plus, created worksheet containing columns from the joined folders. When no Conditions are NOT specified, results seem ok. However, when Condition IS added, worksheet encounters "ORA-30563 outer join operator (+) not allowed in select-list" and returns blank sheet.
    To workaround, created Custom folder with outer join in place. Didn't work either with Conditions specified. No error, but I think that because Discoverer did not 'outer join' the Condition column, the outer join was ignored.
    Any insights, ideas, or workarounds are much appreciated.
    -Jim

    If you build a query that uses an outer join then any items from the potentially deficient side of the join will have (+) appended to them everywhere in the sql. Up until 8.1.7 this was OK in the select list as it was just treated as noise and ignored - However this now fails with ORA-30563:
    outer join operator (+) not allowed in select-list...
    In 4.1.33.1.6 you get the error 'ORA-30563 outer join operator(+) not allowed in select list'.
    In 4.1.36.1.10 the query runs OK.. Your work around I would guess would be to create a custom folder as you suggested.

  • How to achieve outer join operator(+) in HQL?

    Dear all,
    The two tables employee and customer have not explicate association (by FK and PK). In Oracle SQL, we can use the operator (+) as follows for an outer join. For example,
    SELECT * FROM  employee, customer           where employee.name = customer.name(+)
    However, HQL does not support this outer join operator. How can we translate the above SQL select to HQL?
    Regards.
    Pengyou

    shashi_rajak wrote:
    Already posted in [ hibernate forum|https://forum.hibernate.org/viewtopic.php?f=1&t=997869] . This does not have to do with java.
    Yes, but I did not get any solution.
    Hibernate has something to do with java. You can not say for example java has nothing to do with Internet or Internet has nothing to do with Computer. Anyhow, thanks for your reply.

  • ORA-01719: outer join operator (+) not allowed in operand of OR or IN

    I am getting the following Error when I tried to execute my Query.
    Error : ORA-01719: outer join operator (+) not allowed in operand of OR or IN
    select unique t.estblmt_src_typ_id as estblmt_src_typ_id,
    t.name as name from estblmt_src_typ t, src_estblmt_unknown_data u, estblmt_src eSrc, estblmt e,
    additional_addr aa, country c, src_country_state_region scsr
    where
    (t.estblmt_src_typ_id=u.estblmt_src_typ_id and
    e.state_region_id=scsr.state_region_id and
    upper(scsr.code1)='UNKNOWN' and
    u.processed_ind = 'N' and
    eSrc.Estblmt_Alt_Id = u.estblmt_alt_id and
    u.estblmt_src_typ_id = eSrc.estblmt_src_typ_id and
    eSrc.Estblmt_Id = e.estblmt_id and
    e.country_id = c.country_id and
    u.estblmt_element = 'State Region' and
    scsr.estblmt_src_typ_id = u.estblmt_src_typ_id and
    aa.estblmt_id(+)=e.estblmt_id and
    e.end_dt is null) or
    (t.estblmt_src_typ_id=u.estblmt_src_typ_id and
    aa.state_region_id=scsr.state_region_id and
    upper(scsr.code1)='UNKNOWN' and u.processed_ind = 'N' and
    eSrc.Estblmt_Alt_Id = u.estblmt_alt_id and
    u.estblmt_src_typ_id = eSrc.estblmt_src_typ_id and
    eSrc.Estblmt_Id = aa.estblmt_id and aa.country_id = c.country_id and (u.estblmt_element = 'Additional State Code' or u.estblmt_element = 'Additional State Province') and scsr.estblmt_src_typ_id = u.estblmt_src_typ_id
    and aa.estblmt_id=e.estblmt_id and e.end_dt is null) order by t.name

    First, is this query being executed within Apex or at the SQL prompt or in SQL Workshop, or something else? Some context of where it's being executed may help.
    Next, that's a query from hell. How about rewrting it to use ANSI join syntax instead, so it'a bit more readable?
    A quick example for part of it would be:
    FROM (additional_addr aa LEFT OUTER JOIN estblmt e ON aa.estblmt_id = e.estblmt_id )
    etc.
    Just add additional parenthesis for each additional table join, similar to:
    FROM ((additional_addr aa LEFT OUTER JOIN estblmt e ON aa.estblmt_id = e.estblmt_id )
    LEFT OUTER JOIN src_country_state_region scsr ON aa.state_region_id = scsr.state_region_id )
    In the long run it will make the query a bit more legible, so your where clause only lists the query conditions, not the join conditions. Then it becomes easier to quickly glance at it and see where potential problems may be.
    Bill Ferguson

  • ORA-01719: outer join operator (+) not allowed in operand of OR

    Hi all:
    I understand the error, but I'm not sure how to fix my query. In our database, a person does not NEED to have an address. The report I'm trying to create has a parameter for which address the user would like to have displayed. BUT, I need to outer join to the address table since people don't need an address, but we'd want to display all records, even if the address is null. Here's only part of my code since the query is quite large. Let me know if more is needed, and I'll supply it. I'm definately stuck. At this point I'm thinkin' of just creating two reports; one that displays the clients address, and a second that'll display the house physical address. The code:
    WHERE
    :P_ADDR = 'Lessee Mailing Address' AND
    lessee.actor_inst = address.actor_inst (+)
    ) OR (
    :P_ADDR = 'Unit Address' AND
    housing.actor_inst = address.actor_inst (+)
    ) AND

    Stick with ANSI SQL Notation, then you can overcome this restriction.
    See Back to basics: outer joins
    and look for »ORA-01719«

  • SYNTAX "INNER JOIN and OUTER JOIN"

    Hi Experts,
    I think LEFT JOIN,INNER JOIN syntax is in ANSI.
    I know that Oracle has got its own alternate(+) operator to serve the purpose.
    Please tell me whether INNER JOIN,OUTER JOIN,LEFT JOIN,LEFT OUTER JOIN,RIGHT OUTER JOIN these syntaxes present in ORACLE 8I.
    If not in 9i Or highr versions are they existing?
    Thanks in advance,
    Ananth
    null

    Hi,
    8i has inner join. (+) syntax supports LEFT or RIGHT OUTER JOIN.
    FULL OUTER JOIN is supported in 9i, which introduces the JOIN keyword.
    Herman

  • Left Outer Join Not working in BI 7.0 Infoset

    Hi All,
    I am working on BI 7.0. I have to create a report where I have to display the Target values from a target DSO against the transactional data (Operational data).
    I have a DSO where for a “subteam” value target has been set up on different KPIs.
    In the Info Cube, I have transactional data on daily basis per “subteam”. I have to show the actual and target values.
    I have created an Info Set using Target DSO and Daily operational cube, so that I should able to compare the target and actual values of KPIs, for all the “subteam” values (From DSO, irrespective of whether the data is available in cube for those sub team).
    I have used Outer Left Join in the Info set (DSO on left side), but I am unable to see the desired results. It is working just like an inner join.
    Any Idea why the Outer Left Join is not working? The DSO has only one fey field called “subteam” on which I have set outer left join.
    Regards,
    Amit

    Hi,
    did you solve your problem? because I have the same issue right now: the left outer join doesn't seem to do its job.
    Let me know if you have found a solution, it would be appreciated.
    have a nice day,
    Dominic

  • Problem with outer join

    Tables
    Normal EMP TABLE and dept TABLE
    query
    SELECT e.deptno,d.dname
    FROM emp e , dept d
    WHERE E.DEPTNO(+)=D.DEPTNO
    AND (e.deptno=20 or e.job='CLERK')
    question
    When i use the above query i cannot get the extra records from dept table( 40 , OPERATIONS) due to a condition
    as long as it is "OR" we cannot use outer joins.
    Regardless of that condition i need to get that record(40,OPERATION)
    Please reply me it is very urgent for my work now..
    regards
    Boopathi

    select e.deptno,d.dname
    FROM emp e , dept d
    WHERE E.DEPTNO(+)=D.DEPTNO
    AND (e.deptno=20 or e.job='CLERK')
    This will only fetch the record for 20, IF you want for deptno 40 then you should remove your AND clause (AND (e.deptno=20 or e.job='CLERK'))
    select * from dept
    ===========
    DNAME     DEPTNO
    OPERATION     20
    FINANCE     40
    TRADE     22
    select * from emp
    ===========
    ENAME     DEPTNO     JOB
    a     20     CLERK
    b     22     XXX
    select e.deptno,d.dname
    FROM emp e , dept d
    WHERE e.DEPTNO(+)=d.DEPTNO
    =======================
    DEPTNO     DNAME
    20     OPERATION
    22     TRADE
         FINANCE--- This is the one which does not ahve a record in emp but is there in dept hence it has been returned

  • Translating SQL from MYSQL to ORACLE with more than one outer join.

    I will translate the following sqlquery from MYSQL to ORACLE:
    SELECT ticket.ticket_no,ticket.ticket_dato,ticket.ticket_subject,ticket.customer_id,customer_name,ticket.ticket_own_read, ticket.department_id, department.department_name, priority_name, tickstat_name, tickettype_name
    FROM customer, ticket left join department
    on ticket.department_id = department.department_id left join priority on ticket.priority_id = priority.priority_id
    left join ticketstatus on ticket.tickstat_id = ticketstatus.tickstat_id
    left join tickettype on ticket.tickettype_id = tickettype.tickettype_id
    where ticket.customer_id = customer.customer_id and customer.owner_id =
    #session.owner_id#
    I have tried in ORACLE with:
    SELECT ticket.ticket_no,ticket.ticket_dato,ticket.ticket_subject,ticket.customer_id,customer_name,ticket.ticket_own_read, ticket.department_id, department.department_name, priority_name, tickstat_name, tickettype_name
    FROM customer, ticket ,department, priority, ticketstatus, tickettype
    where
    ticket.department_id(+) = department.department_id and
    ticket.priority_id(+) = priority.priority_id and
    ticket.tickstat_id(+) = ticketstatus.tickstat_id and
    ticket.tickettype_id(+) = tickettype.tickettype_id and
    ticket.customer_id = customer.customer_id and customer.owner_id = #session.owner_id#
    I get an error:
    MERANT][ODBC Oracle driver][Oracle]ORA-01417: a table may be outer joined to at most one other table
    How do I translate the code to ORACLE?

    I think that your syntax is wrong. The (+) operator should be on the right hand table column, not the left hand table column if you want all rows on the left hand table column. If this syntax is really what you want, you can create underlying views for each join condiction.

  • Not using Index when SDO_RELATE in Spatial Query is used in LEFT OUTER JOIN

    I want to know for every City (Point geometry) in which Municipality (Polygon geometry) it is.
    Some cities will not be covered by any municipality (as there is no data for it), so its municipality name should be blank in the result
    We have 4942 cities (point geometries)
    and 500 municipalities (polygon geometry)
    SELECT T1.NAME as City, T2.NAME as Municipality
    FROM CITY T1
    LEFT OUTER JOIN MUNICIPALITY T2 ON SDO_RELATE(T1.GEOM, T2.GEOM, 'MASK=ANYINTERACT') = 'TRUE'The explain plan for this query is:
    SELECT STATEMENT
      FILTER
        Filter Predicates
          MDSYS.SDO_RTREE_RELATE(T1.GEOM, T2.GEOM, 'mask=ANYINTERACT querytype=window ') = 'TRUE'
        MERGE JOIN
          TABLE ACCESS              CITY               FULL                            11
          BUFFER                                       SORT                        100605
              TABLE ACCESS          MUNICIPALITY       FULL                            20So the cost is in the BUFFER (whatever that is), it takes +2000 seconds to run this, it is not using the spatial index.
    And we are not getting all rows, but only the ones interacting with a municipality, e.g. 2436 rows.
    But I want all rows, including the ones not interacting with any Municipality.
    When we want only those cities that actually are in a municipality, I use a different query and it will use the index.
    SELECT T1.NAME as City, T2.NAME as Municipality
    FROM CITY T1, MUNICIPALITY T2
    WHERE SDO_RELATE(T1.GEOM, T2.GEOM, 'MASK=ANYINTERACT') = 'TRUE'I get (only) 2436 rows (as expected) in 5 seconds (it is fast) and the explain plan shows it is using the spatial index.
    But in this case, I am not getting any cities not inside any municipality (of course)
    SELECT STATEMENT
       NESTED LOOPS
          TABLE ACCESS                   MUNICIPALITY       FULL                22
          TABLE ACCESS                   CITY               BY INDEX ROWID      22
             DOMAIN INDEX                CITY_SDX                                0
                Access Predicates
                   MDSYS.SDO_RTREE_RELATE(T1.GEOM, T2.GEOM, 'mask=ANYINTERACT querytype=window ') = 'TRUE'I always thought a LEFT OUTER JOIN would return all rows from the Table, whatever happens in the next,
    but it seems the query has been rewritten so that it is now using a Filter Predicate in the end, which filters those geometries having no interaction.
    As an example I also do thing alphanumerically, I do get 4942 rows, including the ones which have no Municipality name.
    In this case the names must match, so its only for testing if the LEFT OUTER JOIN returns stuff correctly, which it does in this case.
    SELECT T1.NAME as City, T2.NAME as Municipality
    FROM CITY T1
    LEFT OUTER JOIN MUNICIPALITY T2 ON T1.NAME = T2.NAMEIs this an Oracle Spatial bug, e.g. not return 4942 rows, but only 2436 rows on the first query?
    Note all tests performed on Oracle 11g R2 (11.2.0.1.0)

    Patrick,
    Even so, your geoms in the relate were the wrong way around.
    Also, I don't recall you saying (or showing) that you wanted the municipality geometry returned. Still,
    no matter, easy to do.
    Here are some additional suggestions. I don't have your data so I have had to use some of my own.
    set serveroutput on timing on autotrace on
    SELECT T1.SPECIES as City,
           (SELECT T2.ADMIN_NAME FROM AUSTRALIAN_STATES T2 WHERE SDO_ANYINTERACT(T2.GEOM, SDO_GEOM.SDO_BUFFER(T1.GEOM,10000,0.5,'UNIT=M')) = 'TRUE') as Municipality,
           (SELECT T2.GEOM       FROM AUSTRALIAN_STATES T2 WHERE SDO_ANYINTERACT(T2.GEOM, SDO_GEOM.SDO_BUFFER(T1.GEOM,10000,0.5,'UNIT=M')) = 'TRUE') as geom
      FROM GUTDATA T1;
    762 rows selected
    Elapsed: 00:00:21.656
    Plan hash value: 2160035213
    | Id  | Operation                   | Name                       | Rows  | Bytes | Cost (%CPU)| Time     |
    |   0 | SELECT STATEMENT            |                            |   762 | 49530 |     5   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| AUSTRALIAN_STATES          |     1 |   115 |     0   (0)| 00:00:01 |
    |*  2 |   DOMAIN INDEX              | AUSTRALIAN_STATES_GEOM_SPX |       |       |     0   (0)| 00:00:01 |
    |   3 |  TABLE ACCESS BY INDEX ROWID| AUSTRALIAN_STATES          |     1 |   115 |     0   (0)| 00:00:01 |
    |*  4 |   DOMAIN INDEX              | AUSTRALIAN_STATES_GEOM_SPX |       |       |     0   (0)| 00:00:01 |
    |   5 |  TABLE ACCESS FULL          | GUTDATA                    |   762 | 49530 |     5   (0)| 00:00:01 |
    Predicate Information (identified by operation id):
       2 - access("MDSYS"."SDO_ANYINTERACT"("T2"."GEOM","SDO_GEOM"."SDO_BUFFER"(:B1,10000,0.5,'UNIT=M'))='TRUE')
       4 - access("MDSYS"."SDO_ANYINTERACT"("T2"."GEOM","SDO_GEOM"."SDO_BUFFER"(:B1,10000,0.5,'UNIT=M'))='TRUE')
       Statistics
                   7  user calls
               24576  physical read total bytes
                   0  physical write total bytes
                   0  spare statistic 3
                   0  commit cleanout failures: cannot pin
                   0  TBS Extension: bytes extended
                   0  total number of times SMON posted
                   0  SMON posted for undo segment recovery
                   0  SMON posted for dropping temp segment
                   0  segment prealloc tasksThe above can look messy as you add more (SELECT ...) attributes, but is is fast (though can't use in Materialized Views).
    /* The set of all cities not in municipalities */
    SELECT T1.SPECIES                 as City,
           cast(null as varchar2(42)) as municipality,
           cast(null as sdo_geometry) as geom
      FROM GUTDATA T1
    WHERE NOT EXISTS (SELECT 1
                         FROM AUSTRALIAN_STATES T2
                        WHERE SDO_ANYINTERACT(T2.GEOM, SDO_GEOM.SDO_BUFFER(T1.GEOM,10000,0.5,'UNIT=M')) = 'TRUE')
    UNION ALL
    /* The set of all cities in municipalities */
    SELECT T1.SPECIES    as City,
           T2.ADMIN_NAME as Municipality,
           T2.GEOM       as geom
      FROM GUTDATA T1
           INNER JOIN
           AUSTRALIAN_STATES T2 ON (SDO_ANYINTERACT(T2.GEOM, SDO_GEOM.SDO_BUFFER(T1.GEOM,10000,0.5,'UNIT=M')) = 'TRUE');
    762 rows selected
    Elapsed: 00:00:59.953
    Plan hash value: 2854682795
    | Id  | Operation           | Name                       | Rows  | Bytes | Cost (%CPU)| Time     |
    |   0 | SELECT STATEMENT    |                            |    99 | 13450 |    38  (87)| 00:00:01 |
    |   1 |  UNION-ALL          |                            |       |       |            |          |
    |*  2 |   FILTER            |                            |       |       |            |          |
    |   3 |    TABLE ACCESS FULL| GUTDATA                    |   762 | 49530 |     5   (0)| 00:00:01 |
    |*  4 |    DOMAIN INDEX     | AUSTRALIAN_STATES_GEOM_SPX |       |       |     0   (0)| 00:00:01 |
    |   5 |   NESTED LOOPS      |                            |    61 | 10980 |    33   (0)| 00:00:01 |
    |   6 |    TABLE ACCESS FULL| AUSTRALIAN_STATES          |     8 |   920 |     3   (0)| 00:00:01 |
    |*  7 |    TABLE ACCESS FULL| GUTDATA                    |     8 |   520 |     4   (0)| 00:00:01 |
    Predicate Information (identified by operation id):
       2 - filter( NOT EXISTS (SELECT 0 FROM "AUSTRALIAN_STATES" "T2" WHERE "MDSYS"."SDO_ANYINTERACT"("T2"."GEOM","SDO_GEOM"."SDO_BUFFER"(:B1,10000,0.5,'UNIT=M'))='TRUE'))
       4 - access("MDSYS"."SDO_ANYINTERACT"("T2"."GEOM","SDO_GEOM"."SDO_BUFFER"(:B1,10000,0.5,'UNIT=M'))='TRUE')
       7 - filter("MDSYS"."SDO_ANYINTERACT"("T2"."GEOM","SDO_GEOM"."SDO_BUFFER"("T1"."GEOM",10000,0.5,'UNIT=M'))='TRUE')
       Statistics
                   7  user calls
              131072  physical read total bytes
                   0  physical write total bytes
                   0  spare statistic 3
                   0  commit cleanout failures: cannot pin
                   0  TBS Extension: bytes extended
                   0  total number of times SMON posted
                   0  SMON posted for undo segment recovery
                   0  SMON posted for dropping temp segment
                   0  segment prealloc tasksMuch slower but Materialized View friendly.
    This one is a bit more "natural" but still slower than the first.
    set serveroutput on timing on autotrace on
    /* The set of all cities in municipalities */
    WITH municipal_cities As (
      SELECT T1.ID         as City,
             T2.ADMIN_NAME as Municipality,
             T2.GEOM       as geom
        FROM GUTDATA T1
             INNER JOIN
             AUSTRALIAN_STATES T2 ON (SDO_ANYINTERACT(T2.GEOM, SDO_GEOM.SDO_BUFFER(T1.GEOM,10000,0.5,'UNIT=M')) = 'TRUE')
    SELECT T1.ID           as City,
           T2.Municipality as Municipality,
           T2.GEOM         as geom
      FROM GUTDATA          T1
           LEFT OUTER JOIN
           municipal_cities T2
           ON (T2.CITY = T1.ID);
    762 rows selected
    Elapsed: 00:00:50.228
    Plan hash value: 745978991
    | Id  | Operation             | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
    |   0 | SELECT STATEMENT      |                   |   762 | 44196 |    36   (3)| 00:00:01 |
    |*  1 |  HASH JOIN RIGHT OUTER|                   |   762 | 44196 |    36   (3)| 00:00:01 |
    |   2 |   VIEW                |                   |    61 |  3294 |    33   (0)| 00:00:01 |
    |   3 |    NESTED LOOPS       |                   |    61 | 10980 |    33   (0)| 00:00:01 |
    |   4 |     TABLE ACCESS FULL | AUSTRALIAN_STATES |     8 |   920 |     3   (0)| 00:00:01 |
    |*  5 |     TABLE ACCESS FULL | GUTDATA           |     8 |   520 |     4   (0)| 00:00:01 |
    |   6 |   INDEX FAST FULL SCAN| GUTDATA_ID_PK     |   762 |  3048 |     2   (0)| 00:00:01 |
    Predicate Information (identified by operation id):
       1 - access("T2"."CITY"(+)="T1"."ID")
       5 - filter("MDSYS"."SDO_ANYINTERACT"("T2"."GEOM","SDO_GEOM"."SDO_BUFFER"("T1"."GEOM",10000,0.5,'UNIT=M'))='TRUE')
       Statistics
                   7  user calls
               49152  physical read total bytes
                   0  physical write total bytes
                   0  spare statistic 3
                   0  commit cleanout failures: cannot pin
                   0  TBS Extension: bytes extended
                   0  total number of times SMON posted
                   0  SMON posted for undo segment recovery
                   0  SMON posted for dropping temp segment
                   0  segment prealloc tasksFinally, the Pièce de résistance: trick the LEFT OUTER JOIN operator...
    set serveroutput on timing on autotrace on
    SELECT T1.SPECIES    as City,
           T2.ADMIN_NAME as Municipality,
           T2.GEOM       as geom
      FROM GUTDATA           T1
           LEFT OUTER JOIN
           AUSTRALIAN_STATES T2
           ON (t2.admin_name = to_char(t1.ID) OR
               SDO_ANYINTERACT(T2.GEOM, SDO_GEOM.SDO_BUFFER(T1.GEOM,10000,0.5,'UNIT=M')) = 'TRUE');
    762 rows selected
    Elapsed: 00:00:50.273
    Plan hash value: 158854308
    | Id  | Operation           | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
    |   0 | SELECT STATEMENT    |                   |   762 | 92964 |  2294   (1)| 00:00:28 |
    |   1 |  NESTED LOOPS OUTER |                   |   762 | 92964 |  2294   (1)| 00:00:28 |
    |   2 |   TABLE ACCESS FULL | GUTDATA           |   762 | 49530 |     5   (0)| 00:00:01 |
    |   3 |   VIEW              |                   |     1 |    57 |     3   (0)| 00:00:01 |
    |*  4 |    TABLE ACCESS FULL| AUSTRALIAN_STATES |     1 |   115 |     3   (0)| 00:00:01 |
    Predicate Information (identified by operation id):
       4 - filter("T2"."ADMIN_NAME"=TO_CHAR("T1"."ID") OR
                  "MDSYS"."SDO_ANYINTERACT"("T2"."GEOM","SDO_GEOM"."SDO_BUFFER"("T1"."GEOM",10000,0.5,'UNIT=M'))='TRUE')
       Statistics
                   7  user calls
                   0  physical read total bytes
                   0  physical write total bytes
                   0  spare statistic 3
                   0  commit cleanout failures: cannot pin
                   0  TBS Extension: bytes extended
                   0  total number of times SMON posted
                   0  SMON posted for undo segment recovery
                   0  SMON posted for dropping temp segment
                   0  segment prealloc tasksTry these combinations to see what works for you.
    Interestingly, for me, the following returns absolutely nothing.
    SELECT T1.SPECIES    as City,
           T2.ADMIN_NAME as Municipality
      FROM GUTDATA           T1
           LEFT OUTER JOIN
           AUSTRALIAN_STATES T2
           ON (SDO_ANYINTERACT(T2.GEOM, SDO_GEOM.SDO_BUFFER(T1.GEOM,10000,0.5,'UNIT=M')) = 'TRUE')
    MINUS
    SELECT T1.SPECIES    as City,
           T2.ADMIN_NAME as Municipality
      FROM GUTDATA           T1
           LEFT OUTER JOIN
           AUSTRALIAN_STATES T2
           ON (t2.admin_name =  to_char(t1.ID) OR
               SDO_ANYINTERACT(T2.GEOM, SDO_GEOM.SDO_BUFFER(T1.GEOM,10000,0.5,'UNIT=M')) = 'TRUE');(I leave it to you to see if you can see why as the LEFT OUTER JOIN seems to be working correctly for me but I am not going to dedicate time to detailed checking of results.)
    Note all tests performed on Oracle 11g R2 (11.2.0.1.0)
    If you get the answer you want: mark the post as answered to assign points.
    regards
    Simon

Maybe you are looking for

  • How do I reverse the order of photos/years in osx

    with the new OS X photos software it shows the most recent year at the bottom of my screen. How do I reverse the order so the most recent year is at the top. Thank you

  • Solve problem

    Details: i have 44dollar but i cant by gem on clash of clan game when i want to buy gem this massage appear (your purchase could not be completed contract i tune store support to complete this transaction please help me to solve problem

  • How make a sql query for chart dynamically [I got it solved]

    Hi , I' m in search of a method to go from a tabular form (click on a item in the record) to a chart page where the from <table> sql of the chart is varying from the item select. eg I click on emp and navigate to a page displaying the chart with a sq

  • I know this is logic.....BUT

    I need help with protools. I'm setting up a seperate patition for protools under tiger and getting the following error........?? NO A PLAYBACK VOLUME .... ??=MY PROTOOLS HARD DRIVE.. I've tried all of my hardrives with no luck... Any help would be ap

  • Portal user password reset!

    I for some reason I reset the Portal (DB Schema) user password and i'm not able to get into the portal page! please help.. here is the err i get --- http://<host>:7778/pls/portal/ Forbidden You don't have permission to access /pls/portal/portal.home