On outer Join Query
Hi All,
I have a outer join query which is creating bottlenecks and increasing the cost of the query, the plan of the query is pretty awkward with multiple nested outer loop joins. Though its the requirement for me to write such a query. I would like to get advice from the SQL community to know whether we can rewrite the query in any other way so that it reduces the cost and there is considerable improvement in the plan.
For example can we rewrite this query to ensure we get the same output with much improved plan and cost.
Basically i want to avoid thsi left Outer Join. Can we do this any way with lesser cost and consistent gets.
Here is a sample query.
Select e.Empno,e.Ename,e.Sal, D.Dname,D.deptno
From
Emp e, Dept d
Where e.Deptno(+) = d.Deptno
Thanks in advance
You haven't given us much to work with, not even your Oracle version. So, start with these:
When your query takes too long
When your query takes too long ...
How to Post a SQL statement tuning request
HOW TO: Post a SQL statement tuning request - template posting
Similar Messages
-
Hi Experts,
I am facing a problem with left outer join query. Am using one standard table and ztable for this join. My problem is values are not extracted from the Ztable.
Query:
SELECT b~lifnr b~belnr b~gjahr b~xblnr b~shkzg b~blart b~zfbdt b~budat b~wrbtr
b~wskto b~zlspr s~EXTRACT_STATUS s~maturity_date FROM bsik AS b
LEFT OUTER JOIN zprm_rvne_sapdoc AS s
ON s~belnr EQ b~belnr
AND s~gjahr EQ b~gjahr
INTO CORRESPONDING FIELDS OF TABLE it_join
WHERE b~zlsch = p_zlsch
AND b~xblnr IN so_invno
ORDER BY b~lifnr b~xblnr.
I have all entries of BSIK table in Ztable with extract status as Y but this query is not fetching extract status and maturity date of ztable so it is blank in the internal table.
Need solution.
Regards
Sridevi SHi,
see the sample wiki for writing the Left outer join
http://wiki.sdn.sap.com/wiki/display/Snippets/EmployeeInfotype0000to9999ChangeHistory
Specifying Two or More Database Tables as a Left Outer Join
The left outer join, on the other hand, reads lines from the left-hand database table or join even if there is no corresponding line in the right-hand table.
SELECT...
FROM <tab> LEFT [OUTER] JOIN <dbtab> [AS <alias>] ON <cond>
<options>
<tab> and <dbtab> are subject to the same rules and conditions as in an inner join. The OUTER addition is optional. The tables are linked in the same way as the inner join with the one exception that all lines selected from <tab> are included in the final selection. If <dbtab> does not contain any lines that meet the condition <cond>, the system includes a single line in the selection whose columns from <dbtab> are filled with null values.
In the left outer join, more restrictions apply to the condition <cond> than in the inner join. In addition to the above restrictions:
EQ or = is the only permitted relational operator.
There must be at least one comparison between columns from <tab> and <dbtab>.
The WHERE clause may not contain any comparisons with columns from <dbtab>. All comparisons using columns from <dbtab> must appear in the condition <cond>.
If we have two tables named stud1,stud2 with the following data
Stud1: id Name stud2: id Name
1 xxx 1 aaa
2 yyy 2 bbb
3 zzz 4 ccc
4 www 6 ddd
When we use Left Outer Join we get the output as:
1 aaa
2 bbb
3 <Null>
4 ccc
When we use Right Outer Join we get the output as:
1 aaa
2 bbb
4 ccc
<Null> ddd
When we use Full Outer Join we get the output as:
1 aaa
2 bbb
3 <Null>
4 ccc
<Null> ddd
Prabhudas -
SCORE(n) returning zero values in an outer join query
Hello all,
Is there any way to get a query that contains an outer join to return proper scores. I couldn't find out why this was happening in my query, but I'm getting a score values of 0 on most results.
Below are queries with result sets. As you can see the results that are scoring in the second query are scoring correctly, but only two have scores.
- - - Query 1, no outer join - - -
SELECT DISTINCT SCORE(0) AS scr,
file_repository.file_id,
file_repository.file_title
FROM file_repository
WHERE CONTAINS(index_url,'SYN(dui,a_thesaurus)', 0) > 0
ORDER BY scr ASC
SCR FILE_ID FILE_TITLE
7 136 Prisoners
7 240 Drug booklet
8 64 Communications
8 146 Rates
8 168 Vehicle Collisions
8 206 document4
14 207 document5
14 211 document5
15 74 Diplomatic Personnel
22 214 documentB
30 81 DUI and PCA Offences
- - - Query 2, with outer join - - -
SELECT DISTINCT SCORE(0) AS scr,
file_repository.file_id,
file_repository.file_title
FROM file_repository, file_security
WHERE CONTAINS(index_url,'SYN(dui,a_thesaurus)', 0) > 0
AND file_repository.file_id = file_security.file_id(+)
AND file_security.auth_id = 0
ORDER BY scr asc
SCR FILE_ID FILE_TITLE
0 74 Diplomatic Personnel
0 81 DUI and PCA Offences
0 136 Prisoners
0 146 Rates
0 168 Vehicle Collisions
0 206 document4
0 207 document5
0 214 documentB
0 240 Drug booklet
8 64 Communications
14 211 document5
This is on Oracle 9i using Oracle Text.
Thanks in advanceTo do this wouldn't you need to know the data in advance? The real source table had 1800 organisations and 8,000,000 transactions.
I Tried this as well, creating a pl/sql package as follows.
create or replace PACKAGE stack AS
TYPE gnt_push_numbers IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
TYPE gvt_push_varchars IS TABLE OF VARCHAR(1000) INDEX BY PLS_INTEGER;
gna_push_numbers gnt_push_numbers;
gva_push_varchars gvt_push_varchars;
FUNCTION PUSH ( pn_push_var NUMBER, pn_offset NUMBER) RETURN NUMBER DETERMINISTIC;
FUNCTION PUSH ( pv_push_var VARCHAR, pn_offset NUMBER) RETURN VARCHAR DETERMINISTIC;
FUNCTION POP_NUM ( pn_offset NUMBER) RETURN NUMBER DETERMINISTIC;
FUNCTION POP_VAR ( pn_offset NUMBER) RETURN VARCHAR DETERMINISTIC;
END stack;
CREATE OR REPLACE
PACKAGE BODY "STACK" AS
FUNCTION push(pn_push_var NUMBER, pn_offset NUMBER) RETURN NUMBER deterministic IS
BEGIN
gna_push_numbers(pn_offset) := pn_push_var;
RETURN pn_push_var;
END push;
FUNCTION push(pv_push_var VARCHAR, pn_offset NUMBER) RETURN VARCHAR deterministic IS
BEGIN
gva_push_varchars(pn_offset) := pv_push_var;
RETURN pv_push_var;
END push;
FUNCTION pop_num(pn_offset NUMBER) RETURN NUMBER deterministic IS
BEGIN
RETURN gna_push_numbers(pn_offset);
END pop_num;
FUNCTION pop_var(pn_offset NUMBER) RETURN VARCHAR deterministic IS
BEGIN
RETURN gva_push_varchars(pn_offset);
END pop_var;
END stack;
Unfortunately it appears to act before the rows are sorted, so will only work in specialised circumstances, in that you have to ensure the rows have been sorted before the function is used.
SELECT PUSH(COL), POP..(COL)
FROM ( SELECT etc.
Luckily the client decided they didn't want to mix their graphs any more so a more classic approach using a base table select for actuals and then a date table select with a sub-query columns for the projection provided a simple solution. -
Outer join query for SQL server from Oracle
Hi All,
My question is regarding making queries from Oracle to SQL Server database thorugh DBLink.
In my oracle database I have a DBLink emp.world for SQL Server database.
I need to query SQL Server data from oracle (so that this query can be combined with other oracle tables).
Query is given below:
SELECT
a."EmpID" as "Employee ID",
a."EmpStatus" "Employee Status"
b."EmpSub" as "Employee Subjects"
FROM
[email protected] a
left outer join [email protected] b on a."EmpID" = b."suEmpID"
ORDER BY a."EmpID";My problem is when I run the same query from oracle, it does not show the EmpID that does not exist in Subjects table, but when run from actual SQL Server database, it shows all the records.
Samples are given below:
Run from Oracle
Employee ID Employee Status Employee Subjects
101 Active Maths
102 Active Maths
102 Active Physics
104 Inactive Chemistry
Run form SQL Server
Employee ID Employee Status Employee Subjects
101 Active Maths
102 Active Maths
102 Active Physics
103 Active NULL
104 Inactive ChemistryI am not sure why in oracle outer join for SQL server tables is not working. What is the right way for outer join in this case.
I am using oracle database 10gR2 and SQL Server 2005.
Please Help.
Thanks.SELECT
a."EmpID" as "Employee ID",
a."EmpStatus" "Employee Status"
b."EmpSub" as "Employee Subjects"
FROM
[email protected] a
left outer join [email protected] b on a."EmpID" = b."suEmpID"
ORDER BY a."EmpID";
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/queries006.htm#sthref3175
From your description, it appears you may need a right outer join. You want to get back all the rows from 'B', not from 'A'. Try a right join and let us know. -
Filter on "---" in Left Outer Join Query
Hi guys,
very basic question but I have not found an answer, yet. I built an left outer join MDO query and need to select all those dataset that did not find a "partner", that is fields are set to "---". However, I do not manage to filter on '---', NULL...
When using SQL, it appears to be a String "---" but in MDO???Hey guys, found out that IS NULL needs to be used in query. Anyway, it appears to cause problems somewhere else.
I placed an IS NULL filter expression inside a join query but query did not return any results when called in by transaction. After removing this line, both NULL and NOT NULL data were returned. When used in test mode, IS NULL was working fine... -
Full outer join query giving error
Hi I have written the below query to get the fields below as an out put but am getting the error missing keyword..am not understanding where did i missed..i have done step by step query analysis..but could not find the error.
Please help me in resolving the issue.
Expected output Columns :*
COUNTRY , TRN_TYPE ,SKU ,BIX_Customer ,PERIOD ,CURRENTSTOCK ,STOCK_VALUE ,SALES ,SALES_VALUE ,TARGET
Query :_
select (case when a.country is null then b.country when b.country is null then c.country else a.country end) AS COUNTRY,
(case when a.Sale_Type is null then b.Stk_type when b.stk_type is null then c.Stk_type else a.Sale_Type end) AS TRN_TYPE,
(case when a.sku is null then b.sku when b.sku is null then c.sku else a.sku end) AS SKU,
(case when a.bix_customer is null then b.bix_customer_code when b.bix_customer_code is null then c.bix_customer_code else a.bix_customer end)AS BIX_Customer ,
(case when a.period is null then TO_number(b.period) when b.period is null then TO_NUMBER(c.period) else a.period end) AS PERIOD,
nvl(b.CURRENTSTOCK,0) AS CURRENTSTOCK,
nvl(b.stock_value,0) AS STOCK_VALUE,
nvl(a.sales,0) AS SALES,
nvl(a.SALES_VALUE,0) AS SALES_VALUE,
nvl(c.TARGET_QTY,0) AS TARGET
from
(select UPPER(c.cust_country_name) AS COUNTRY,
DECODE(ds.account_key,7156,'SAMPLE',7157,'BONUS',7485,'SALE') AS Sale_Type,
substr(i.item_code,7) AS SKU,
c.bix_customer_code AS BIX_Customer,
ds.descr as descr ,
ds.period as period,
sum(ds.quantity) AS SALES,
sum(case when ds.local_value is null then ds.euro_value else ds.local_value END) AS SALES_VALUE
FROM distributor_sales ds, customer c, item i
where ds.customer_key=c.customer_key
and ds.item_key= i.item_key
group by ds.period,
ds.account_key,
c.cust_country_name,
substr(i.item_code,7),
c.bix_customer_code,
ds.descr) a
full outer join
(SELECT UPPER(b.cust_country_name) AS COUNTRY,
DECODE(s.stock_type,'SALE','SALE','SALES','SALE','BONUS','BONUS','SAMPLE','SAMPLE') AS Stk_type,
substr(c.item_code,7) AS SKU,
s.descr as descr,
s.period as period,
b.bix_customer_code,
sum(s.CLOSING_STOCK) CURRENTSTOCK,
sum(s.closing_stock*s.cif_price) STOCK_VALUE
FROM STOCK s, customer b, item c
WHERE s.customer_key=b.customer_key
and s.item_key= c.item_key
group by
s.descr,
s.stock_type,
s.period, b.bix_customer_code,b.cust_country_name,substr(c.item_code,7) ) b
full outer join
(SELECT UPPER(cu.cust_country_name) AS COUNTRY,
DECODE(t.description,'SALES TARGET','SALE') AS Stk_type,
substr(it.item_code,7) AS SKU,
t.channel as channel,
t.period as period,
cu.bix_customer_code as bix_customer_code,
sum(t.quantity) TARGET_QTY
FROM sales_target t, customer cu, item it
WHERE t.customer_key=cu.customer_key
and t.item_key= it.item_key
group by
t.channel,
t.description,
t.period, cu.bix_customer_code,cu.cust_country_name,substr(it.item_code,7) ) c
on a.SKU=b.SKU
and a.sku=c.SKU
and b.sku=c.SKU
and a.BIX_Customer=b.bix_customer_code
and a.BIX_Customer=c.bix_customer_code
and b.bix_customer_code=c.bix_customer_code
and a.Sale_Type=b.Stk_type
and a.Sale_Type=c.Stk_type
and b.Stk_type=c.Stk_type
and a.descr=b.descr
and b.descr=c.channel
and a.descr=c.channel
and a.country=b.country
and a.country=c.COUNTRY
and b.country=c.COUNTRY
and a.period=b.period
and a.period=c.period
and b.period=c.period;<tt>Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production</tt>
You must be aware that you must cascade full outer joins
with
t1 as
(select 1 key,1.1 data from dual union all
select 3,1.3 from dual union all
select 6,1.6 from dual union all
select 7,1.7 from dual
t2 as
(select 2 key,2.2 data from dual union all
select 3,2.3 from dual union all
select 4,2.4 from dual union all
select 6,2.6 from dual
t3 as
(select 4 key,3.4 data from dual union all
select 5,3.5 from dual union all
select 6,3.6 from dual union all
select 7,3.7 from dual
select nvl(x.key,t3.key) key,
x.data_1,
x.data_2,
t3.data data_3
from (select nvl(t1.key,t2.key) key,
t1.data data_1,
t2.data data_2
from t1
full outer join
t2
on t1.key = t2.key
) x
full outer join
t3
on t3.key = x.key
order by keyunless you can live with duplicate key rows you cannot avoid whenever all table pairs contain common keys (try the below using data from above)
select coalesce(t1.key,t2.key,t3.key) key,
t1.data data_1,
t2.data data_2,
t3.data data_3
from t1
full outer join
t2
on t1.key = t2.key
full outer join
t3
on t3.key = t1.key
and t3.key = t2.key
order by key
select coalesce(t1.key,t2.key,t3.key) key,
t1.data data_1,
t2.data data_2,
t3.data data_3
from t2
full outer join
t3
on t2.key = t3.key
full outer join
t1
on t1.key = t2.key
and t1.key = t3.key
order by key
select coalesce(t1.key,t2.key,t3.key) key,
t1.data data_1,
t2.data data_2,
t3.data data_3
from t1
full outer join
t3
on t1.key = t3.key
full outer join
t2
on t2.key = t1.key
and t2.key = t3.key
order by keyRegards
Etbin
Edited by: Etbin on 10.4.2013 9:53
If you're after
select *
from (select *
from (select *
from t1
) a
full outer join
(select *
from t2
) b
on t1.key = t2.key
) x
full outer join
t3
on t3.key = x.key
order by keyyou're presently at
select *
from (
(select *
from t1
) a
full outer join
(select *
from t2
) b
on t1.key = t2.key
) x
full outer join
t3
on t3.key = x.key
order by keyORA-00933: SQL command not properly ended -
Help Required with an OUTER JOIN Query
Hi,
I need a list of records carrying UserID and ALL SectionIDs and SectionTitles he/she is associated
with so I created following query:
SELECT UsersSections.UserID, Sections.SectionID, Sections.SectionTitle
FROM UsersSections, Sections
WHERE UsersSections.SectionID(+) = Sections.SectionID AND UsersSections.UserID = 1
Where my tables are:
- UsersSections (UserID, SectionID)
- Sections (SectionID, SectionTitle)
The problem is that if I exclude WHERE UserID = '1' clause the query return the desired result i.e. ALL Sections
And ALL Users associated with the any Section(s). But I need results for a particular UserID but
Including WHERE UserID = '1' clause only return records for that User only not the sections he/she belongs to which was the purpose of using OUTER JOIN.
Any help will be highly appreciated.
Thanks.
AKGuserssections.userid (+) = 1
-
Issue on left outer join query in 10G
Dear Mr./Mrs./Ms. Oracle expertise,
The following query structure can function properly in Oracle 9i, but not work in Oracle 10G.
Please kindly advise what happened in Oracle 10G?
Is it a bug in 10G? If yes, any patch for it?
select a.col1,
a.col2,
a.col5,
b.col3,
b.col4
from t1 a
inner join t2 c on c.col1 = a.col1
left join (select col3
col4
from t3) b
on b.col1 = a.col1
and a.col2 = 'Y' <---------- seems 10G cannot allow this condition
where a.col5 = 123;
Purpose of above SQL
====================
Only those records from t1 table with a.col2 = 'Y' will
do the left outer join to "b" table and get the columns b.col3 and b.col4
Result set in Oracle 9i
=======================
col1 col2 col5 col3 col4
AAA N 111
BBB N 222
CCC Y 333 XYZ OOO
DDD Y 444 QPR 111
Result set in Oracle 10G
========================
col1 col2 col5 col3 col4
AAA N 111
BBB N 222
CCC Y 333
DDD Y 444
Rgds,
Ken ChanDear Schneider,
Sorry that there was a typo in my query.
Below is the revised query.
select a.col1,
a.col2,
a.col5,
b.col3,
b.col4
from t1 a
inner join t2 c on c.col1 = a.col1
left join (select col1,
col3,
col4
from t3) b
on b.col1 = a.col1
and a.col2 = 'Y' <---------- seems 10G cannot allow this condition
where a.col5 = 123;
Thanks.
Rgds,
ken Chan -
Tune Outer Join query..
Hi,
I have a query like this:
select distinct a.request_id,a.request_name,b.request_dates
from request_master a, request_detail b
where a.request_id = b.request_id(+)In the above query, request_master is the master table whic contains single request per row and request_detail table is its child containing multiple rows of same request.
Now, I need distinct request ids from both the tables and that too if ID is not in child table still the record should come which is why the outer join..
I need to wrtie the above query in other way and get the same result but it is tuned for performance.... I mean just like i use anti join and semi join with Not Exists and Exists.....
Pls help me.. And thx to all of you who are helping me a lot and i am learning new things from you guys..
Thx,
JPHi,
I have a query like this:
select distinct
a.request_id,a.request_name,b.request_dates
from request_master a, request_detail b
where a.request_id = b.request_id(+)In the above query, request_master is the master
table whic contains single request per row and
request_detail table is its child containing multiple
rows of same request.
Now, I need distinct request ids from both the tables
and that too if ID is not in child table still the
record should come which is why the outer join..
I need to wrtie the above query in other way and get
the same result but it is tuned for performance.... I
mean just like i use anti join and semi join with Not
Exists and Exists.....
Pls help me.. And thx to all of you who are helping
me a lot and i am learning new things from you
guys..
Thx,
JPif request_master and request_detail have a on-to-many relationship with a foreign key constraint on request_id from both the tables and request_master's primary key is request_id, and if you want the distinct values of request_id from both the tables like you said, all you have to do is
select request_id from request_master;
this will give you what you want.
Now, if there is no constraint between the two tables and there is no primary key on request_master and no foreign key on request_detail then
select request_id from request_master
union
select request_id from request_detail;
in both cases , you better have an index for request_id on both the tables ( non unique for the second case -- don't know why one would do it this way.. but whatever your design -- who cares ) and ( for the first case primary key on request_master.request_id and foreign key constraint on request_detail.request_id references request_master.request_id and non unique index on request_detail.request_id )
--Samson -
HI
IF I WROTE THIS QUERY ITS WORKING FINE AS OUTER JOIN
SELECT USER_CODE,USER_GROUP,PROG_MODULE,PROG_NAME FROM
MENU_USERS RIGHT OUTER JOIN MENU_GROUP_ACCESS ON(USER_GROUP=GRPACC_GRPCODE)
RIGHT OUTER JOIN PROGMASTER ON
( GRPACC_COMPCODE =PROG_COMPCODE
AND GRPACC_MODULE = PROG_MODULE
AND GRPACC_OPTION=PROG_OPTION
AND GRPACC_SNO=PROG_SNO
AND GRPACC_GRPCODE='AC3' <<==
BUT I STOP THIS POINTED (<<==) LINE
I AM UNABLE TO GET THE RECORDS THAT ARE EXISTS IN PROGMASTER
BUT NOT IN OTHER TABLE...
COULD U PLZ TELL ME WOT M I MISSINGSELECT MG.GRPACC_GRPCODE,MU.USER_CODE,MU.USER_NAME,PR.PROG_MODULE,PR.PROG_NAME
FROM MENU_GROUP_ACCESS MG,PROGMASTER PR ,MENU_USERS MU
WHERE MU.USER_GROUP(+) = MG.GRPACC_GRPCODE
AND MG.GRPACC_COMPCODE(+)=1
AND MG.GRPACC_GRPCODE(+)= 'LS3' --<<<<<<<with it
AND PR.PROG_COMPCODE = MG.GRPACC_COMPCODE(+)
AND PR.PROG_MODULE = MG.GRPACC_MODULE(+)
AND PR.PROG_OPTION = MG.GRPACC_OPTION(+)
AND PR.PROG_SNO = MG.GRPACC_SNO(+)
the result with nulls as outer join
GRP USER USER_NAME PR PROG_NAME
LS3 LSS Hard Stone12 P1 Country Master
P1 City Master
P1 color Master
P1 Option B2
LS3 LSS Hard Stone12 P1 Model
P1 Data Load
P1 Matrix
P1 Difference
P1 Terms
LS3 LSS Hard Stone12 P1 Baners
LS3 LSS Hard Stone12 P1 Cost EstEdited by: hard_stone on Jan 13, 2009 9:46 PM -
BI 7.0 Infoset - Infocube - Left outer join - query
Hi Expert,
A infoset contain Infocube and ODS, linked with left outer join, common fields are PO,PO item. PO account assignment ODS have three keyfields: PO Doc.,Item,account Assignment .
PO Infocube <b>PO Account Assignment ODS</b>
PO PO item Amt<b>PO Doc. Item AccAssignment Cost object</b>
1000 10 230 <b>1000 10 1 CC1</b>
1001 10 250 <b>1002 10 1 CC1</b>
1002 10 150 <b>1002 10 2 CC2</b>
in BEx result are like this:
1000 10 230 1 CC1
1001 10 250 # #
1002 10 150 1 CC1
1002 10 150 2 CC2 ( amount only duplicated)
The issue was that amount gets duplicated. It only occurs if PO has more than one account assignment.
In report, we want show like this
1000 10 230 1 CC1
1001 10 250 # #
1002 10 150 1 CC1
1002 10 # 2 CC2
Any suggestion or input to overcome this issue?
Thanks,
Saran
Message was edited by:
Saravanan KHi,
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 -
Help need for Outer Join Query Mysterious Query...
I have two table parent tablea and child tableb
Now
tableb has field by name table_id,keyword_name,keyword_value
tablea has field by name
table_id,table_name
I need a query which would retrieve union of this two set...(for table_name)
1)all table_name having keyword_name='abc' and value=12
2)all the table_name that does not have 'abc' as keyword in tableb.....
Please let me know how it can be done....Ok then, try this.
select
a.table_name
from
tablea a, tableb b
where
a.table_id = b.table_id
and b.keyword_name = 'abc'
and b.value = 12
union
select
c.table_name
from
tablea c
where
not exists (select 1 from tableb d
where d.table_id = c.table_id
and d.keyword_name = 'abc'
) ;To get a faster answer and avoid wrong guesses, I always find it helpful to show sample data and sample output when asking a SQL question. For example:
TableA -----------------
table_id table_name
1 AAA
2 BBB
3 CCC
4 DDD
5 EEE
TableB -----------------
table_id keyword_name value
1 abc 12
1 def 23
2 abc 13
4 def 12
5 abc 13
5 def 12
Desired output of query: -----------------
AAA
CCC
DDD -
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. -
Left Outer Join on same table clarification
HI,
I have a table that gets populated from 3<sup>rd</sup> party system. We don’t have control over it. So, the table has master record (master) and children. Master type is 78 and children’s type is 64. So, it looks like this. In the 3<sup>rd</sup>
party system, if Master transaction gets cancelled, it is recorded as type 178. If child is cancelled, then it is 164. Once the child is cancelled and created again using one process then newly created transaction will have 65 as type. Same thing with Master
cancelled transaction also. It will be 79. So, to summarize:
Master:
Brand New Transaction type = 78
Cancelled Transaction type = 178
Cancelled with creation transaction type = 79
Child:
Brand New Transaction type = 64
Cancelled Transaction type = 164
Cancelled with creation transaction type = 65
I don’t have to bother about master records. I need to focus on only children for my query.
ID
TxnID
Master
Type
TDate
Location
193075
211554
211543
64
20140805
ABC
193076
211555
211543
64
20140805
NBC
193077
211556
211543
64
20140805
ABC
193080
211559
211558
64
20140805
ABC
193081
211562
211561
64
20140805
ABC
193082
211565
211564
64
20140805
CBC
193083
211565
211564
164
20140805
CBC
193084
211566
211564
65
20140805
AZC
--drop
table #Transactions
CREATE
TABLE #Transactions
ID
int,
TxnID
int,
mstTicket
int,
Typecode
int,
Tdate
datetime,
Location
varchar(10)
select
* from
#Transactions
Insert
into #Transactions
(ID,
TxnID,
mstTicket,Typecode,Tdate,Location)
Select 193075, 211554,211543,64,'2014-08-05','ABC'
UNION ALL
Select 193076, 211555,211543, 64,
'2014-08-05',
'NBC' UNION ALL
Select 193077, 211556, 211543, 64,
'2014-08-05',
'ABC' UNION
ALL
Select 193080, 211559, 211558, 64,
'2014-08-05',
'ABC' UNION
ALL
Select 193081, 211562, 211561, 64,
'2014-08-05',
'ABC' UNION
ALL
Select 193082, 211565, 211564, 64,
'2014-08-05',
'CBC' UNION
ALL
Select 193083, 211565, 211564, 164,
'2014-08-05',
'CBC' UNION
ALL
Select 193084, 211566, 211564, 65,
'2014-08-05',
'AZC'
select
T.TxnID,
T.TypeCode,
T.Location,
TL.TxnID
From
#Transactions T
Left Outer
JOIN #Transactions
TL ON
TL.TxnID
= T.TxnID
and TL.TypeCode
= 164
select
T.TxnID,
T.TypeCode,
T.Location,
TL.TxnID
From
#Transactions T
Left Outer
JOIN #Transactions
TL ON
TL.TxnID
= T.TxnID
and TL.TypeCode
= 164
Where
T.typecode
in (64, 65)
I need a clarification regarding left Outer Join.
In the first left outer join query both 64 and 164 both have TL.TxnID populated. Why is that?. What I understand from
left outer join is that ‘Returns all the rows’ from left table and only matching data from right table.
Here, matching row from right table is 211565 and 164 record (id 193083). So, only it should have TxnID populated. But row 211565 and 64 has TL.txnID getting populated (ID 193082).
Why is it? Am I not understanding left out join properly?
Thanks,Thank you Shailesh. I understood what join does in left outer join. I was thinking
Left Outer JOIN #Transactions TL ON TL.TxnID = T.TxnID and TL.TypeCode = 164 is same as
Left Outer JOIN #Transactions TL ON TL.TxnID = T.TxnID and TL.TypeCode = T.TypeCode
and TL.TypeCode = 164
#Transactions
T
Left
Outer
JOIN
#Transactions
TL
ON
TL.TxnID
=
T.TxnID
and
TL.TypeCode
= 164
Where
T.typecode
in
(64,
65) -
Creating WHERE clause for an outer join using DatabaseFilter
Hi all,
I read a post on thie group about constructing the WHERE clause for a RowSet Controls
SQL Query using the DatabaseFilter and this is what it said:
****************************************************************************The
following example shows adding part of a WHERE clause in an action method of a
page flow:
DatabaseFilter.FilterTerm term = new DatabaseFilter.FilterTerm(); term.sColumnName
= "name"; term.op = DatabaseFilter.opContains; // there are ops for equals, less
than, etc... term.value = form.getPartialName();
// You can also add sort terms for an ORDER BY clause allNames = dbControl.getNames(new
DatabaseFilter(new DatabaseFilter.FilterTerm[] {term}, null));
I am trying to create a where clause which uses a join like this:
Select * from x,y where x.id=y.id (+)
ie. All values from x.id but only corrosponding ones from y.id.
Is there any way to build this outer join query using the DatabaseFilter class
or am i forced to use a String which is contruct in my page flow as the where
clause?like so:
* @jc:sql command-type="grid"
* rowset-name="RFPSRowSet"
* max-rows="1000"
* statement::
* SELECT RFPS.RFP_ID,RFPS.NAME AS RFP_NAME,RFPS.FFO_NUMBER,RFPS.RFP_TYPE,RFPS.CFDA_NUMBER,COMPETITIONS.NAME
AS COMP_NAME,COMPETITIONS.COMPETITION_ID FROM RFPS,COMPETITIONS WHERE {sql: whereClause
} {sql: filter.getOrderByClause ()}
public RowSet getAllRfps(java.lang.String whereClause,DatabaseFilter filter)
throws SQLException;
and in my pageFlow action, i do the following:
StringBuffer whereClause= new StringBuffer();
whereClause.append("RFPS.RFP_ID = COMPETITIONS.RFP_ID (+)");
if ((form.getRfpTitle() != null) &&
(!form.getRfpTitle().equalsIgnoreCase("")))
whereClause.append(" AND UPPER(RFPS.NAME) LIKE %"+form.getRfpTitle().toUpperCase());
if ((form.getCfdaNumber() != null) &&
(!form.getCfdaNumber().equalsIgnoreCase("")))
whereClause.append(" AND RFPS.CFDA_NUMBER ="+form.getCfdaNumber());
if ((form.getFfoNumber() != null) &&
(!form.getFfoNumber().equalsIgnoreCase("")))
whereClause.append(" AND RFPS.FFO_NUMBER ="+form.getFfoNumber());
sortFilterService = SortFilterService.getInstance(getRequest());
DatabaseFilter filter=sortFilterService.getDatabaseFilter(getGridName());
log.debug("***********"+whereClause.toString()+"***********");
allRows = searchRfaAndComp.getAllRfps(whereClause.toString(),filter);
Thanks in advance for your help,
Regards,
Vik.Thanks for your reply. Just one more question....if we indeed are trying to use
a simple query and have a where clause like "select * from x where upper(x) like
{x}", how do we set the UPPER filter on the column using the database filter?
I see a IDENTIFIER.ISUPPER static field on that DatabaseFilter but am unsure how
to use it. Would appreciate any pointers .
Thanks again,
Vik
Eddie O'Neil <[email protected]> wrote:
Vik--
I believe that the approach that you describe below is the best one
for dealing with outer joins
with the DatabaseFilter.
Apologies for the limitation...
Eddie
vik wrote:
Hi all,
I read a post on thie group about constructing the WHERE clause fora RowSet Controls
SQL Query using the DatabaseFilter and this is what it said:
****************************************************************************The
following example shows adding part of a WHERE clause in an actionmethod of a
page flow:
DatabaseFilter.FilterTerm term = new DatabaseFilter.FilterTerm(); term.sColumnName
= "name"; term.op = DatabaseFilter.opContains; // there are ops forequals, less
than, etc... term.value = form.getPartialName();
// You can also add sort terms for an ORDER BY clause allNames = dbControl.getNames(new
DatabaseFilter(new DatabaseFilter.FilterTerm[] {term}, null));
I am trying to create a where clause which uses a join like this:
Select * from x,y where x.id=y.id (+)
ie. All values from x.id but only corrosponding ones from y.id.
Is there any way to build this outer join query using the DatabaseFilterclass
or am i forced to use a String which is contruct in my page flow asthe where
clause?like so:
* @jc:sql command-type="grid"
* rowset-name="RFPSRowSet"
* max-rows="1000"
* statement::
* SELECT RFPS.RFP_ID,RFPS.NAME AS RFP_NAME,RFPS.FFO_NUMBER,RFPS.RFP_TYPE,RFPS.CFDA_NUMBER,COMPETITIONS.NAME
AS COMP_NAME,COMPETITIONS.COMPETITION_ID FROM RFPS,COMPETITIONS WHERE{sql: whereClause
sql: filter.getOrderByClause ()}* ::
public RowSet getAllRfps(java.lang.String whereClause,DatabaseFilter
filter)
throws SQLException;
and in my pageFlow action, i do the following:
StringBuffer whereClause= new StringBuffer();
whereClause.append("RFPS.RFP_ID = COMPETITIONS.RFP_ID (+)");
if ((form.getRfpTitle() != null) &&
(!form.getRfpTitle().equalsIgnoreCase("")))
whereClause.append(" AND UPPER(RFPS.NAME) LIKE %"+form.getRfpTitle().toUpperCase());
if ((form.getCfdaNumber() != null) &&
(!form.getCfdaNumber().equalsIgnoreCase("")))
whereClause.append(" AND RFPS.CFDA_NUMBER ="+form.getCfdaNumber());
if ((form.getFfoNumber() != null) &&
(!form.getFfoNumber().equalsIgnoreCase("")))
whereClause.append(" AND RFPS.FFO_NUMBER ="+form.getFfoNumber());
sortFilterService = SortFilterService.getInstance(getRequest());
DatabaseFilter filter=sortFilterService.getDatabaseFilter(getGridName());
log.debug("***********"+whereClause.toString()+"***********");
allRows = searchRfaAndComp.getAllRfps(whereClause.toString(),filter);
Thanks in advance for your help,
Regards,
Vik.
Maybe you are looking for
-
Splash Screen and not beyond... Closes abruptly? PE8 WinXP SP2
Splash Screen and not beyond... Closes abruptly? PE8 WinXP Professional SP2: I got a lot of good info from the forum today, I do not have the internet at my house, which has added to this $100+ headache so I'm gonna try some stuff tonight and check b
-
Hi, We have a sales order workflow for exceptional demand. In one of the steps of the workflow,the corresponding task executes in background. Sales Order Change BAPI is called within this task. Now the problem is that in case the sales order is locke
-
Is Nokia a fan of chocolate eggs? I'm unable to get NSU to connect to nokia for updates over my broadband connection, I cannot check for updates from my phone over UMTS, and this site is *very* slow. Too much chocolate perhaps? Seriously though.. is
-
HT4623 can i connect my ipod to internet on my pc
i dont have wireless ,can i connect it to internet using the data cable on my pc or laptop,please suggest
-
Why have my January photographs disappeared from my ipad air but appeared on my ipad?
i took photos with the ipad air. they have synched with the ipad but the earliest ones have now disappeared from the ip air. As have other earlier photos. Also, I'm paying for extra Cloud but how do I access it ? Machine keeps saying I have no space