Sql to JOIN 3 tables
I need some help on my sql to join 3 tables.
I am close, but my results come out to be a multiple of what im supposed to get.
I am trying to retrieve a sum from table 2 and table 3.
there are 4 records in table2 and 3 records in table3
the results SHOULD be 3 and 20
but i get 12/60
which is a number i shoudl get times the #records of the oppposite table.
i have moved my code in different arrangements to see if that is the issue, but it doesnt seem to matter. i still get the result of a multiple.
Heres my code so far:
SELECT sum(table3.field) AS sumtable3, sum(table3.field) AS sumtable2
FROM table1
LEFT JOIN table2 ON table1.id=table2.id
LEFT JOIN table3 ON table2.id=table3.id
GROUP BY table1.id
ORDER BY table1.id
Please provide sample data for all 3 tables.
Similar Messages
-
Joining 2 tables in oracle database using SQL
I want to join 2 tables together before executing a statement.
problem is one is a table of users, who have userID's
and the othet table is a table of events that are owned by a userID, ie can have many events by same userID.
i want to retrieve forename and lastname from the users table, nd the event details from the event table, and put a name against each event rather than a userID, how can i do this?
note i want to extract EVERY SINGLE EVENT, and get the name of the user it is owned by via the userID
heres a example of a row
Table Users
| UserID | Forename | Surname |
| Y244850 | Jimmy | Conner |
| Y256738 | Mikey | Reeves |
Table Events
| UserID | Date | Type | Location |
| Y244850 | 07-Jan-01 | Holiday | Ibiza |
| Y244850 | 15-Dec-01 | Holiday | Jamaica |
------------------------------------------------Well just exchange user_id with u.user_ud or l.user_id:
SQL> SELECT forename, surname, TO_CHAR(id) id,
TO_CHAR(start_date) start_date, TO_CHAR(end_date)
end_date, type, u.user_id, location FROM leave_details l,
user_details u WHERE l.user_id = u.user_id;
When you just say select user_id, the database doesn't know wich user_id to use. The one in details or in users...
(Even though you and me know its the same)
So just be spesific and choose one.
Sjur -
Joining two tables, sql query
This is a newbie question! I would like to join two tables. Table_1 contains xml stylesheets:
id stylesheet doc
1 <xml stylesheet doc A>
2 <xml stylesheet doc B>
And Table_2 contains the XML documents that the stylesheets will transform:
id XML doc
1 <XML document 1>
1 <XML document 2>
1 <XML document 3>
2 <XML document 4>
2 <XML document 5>
I would like <xml stylesheet doc A> to transform only XML doc that have an id of 1, so I tried this sql statement:
select a.stylesheet_doc ,b.xml_doc from Table_1 a, Table_2 b where a.id=b.id and a.id=1;
This statement returns the rows I want (stylesheet doc with id equals 1, and xml_doc with id equals 1), but it pairs each xml document with a style sheet.
stylesheet doc A <XML document 1>
stylesheet doc A <XML document 2>
stylesheet doc A <XML document 3>
My question is, is there a way to have a result that looks like this?
stylesheet doc A
<XML document 1>
<XML document 2>
<XML document 3>
That is, is there a way in sql to get rid of duplicate stylesheet doc A?
I have tried group by and rollup and xmlagg.
Thank you very, very much for your help.
JimHi, Jim,
Welcome to the forum!
You just want to display the XML, not actually transform it, right?
GROUP BY ROLLUP should work, but I find it easier with GROUP BY GROUPING SETS. Here's an example from tables in the scott schema:
SELECT CASE
WHEN GROUPING (ename) = 1
THEN d.dname
END AS dname
, e.ename
FROM scott.dept d
JOIN scott.emp e ON d.deptno = e.deptno
GROUP BY GROUPING SETS ( (d.dname, e.ename)
, (d.dname)
ORDER BY d.dname
, ename NULLS FIRST
;Output:
DNAME ENAME
ACCOUNTING
CLARK
KING
MILLER
RESEARCH
ADAMS
FORD
JONES
SCOTT
SMITH
SALES
ALLEN
BLAKE
JAMES
MARTIN
TURNER
WARDYou may have noticed that this site noramlly compresses whitespace.
Whenever you post formatted text (such as query results) on this site, type these 6 characters:
\(small letters only, inside curly brackets) before and after each section of formatted text, to preserve spacing. -
Joining two tables using PL/SQL
here i am trying to join two tables can any one tell me what is wrong with this syntex
CREATE OR REPLACE PROCEDURE test IS
CURSOR c1 IS SELECT seq,fname,lname from t1;
CURSOR c2 IS SELECT seq1,q,a from t2;
userjob number;
BEGIN
OPEN c1;
insert into t3 values(c1.seq,c1.fname,c1.lname);
FETCH c1.seq INTO userjob;
FOR c1rec IN c2 LOOP
IF (c1rec.seq=c1.seq and c1rec.q1='why') THEN
insert into t3 values(c1rec.q1,c1rec.a1);
elsif (c1rec.seq=c1.seq and c1rec.q1='what') then
insert into t3 values(c1rec.q2,c1rec.a2);
elsif (c1rec.seq=c1.seq and c1rec.q1='when') then
insert into t3 values(c1rec.q3,c1rec.a3);
elsif (c1rec.seq=c1.seq and c1rec.q1='where') then
insert into t3 values(c1rec.q4,c1rec.a4);
END IF;
END LOOP;
END;
/You should always fetch a cursor before using it's values. All columns in the select should be fetched into variables or a record-variable. You can't refer to the cursor-columns values with c1.seq etc.
r1 c1%rowtype;
l_found boolean;
BEGIN
OPEN c1;
FETCH c1 INTO r1;
insert into t3 values(r1.seq,r1.fname,r1.lname);
l_found := c1%found;
close c1;
if l_found
then
It is also better to close the cursor and check if the select resulted in a row. With this code you will only retrieve one row even if the select will result in multiple rows.
But I agree with all the others that this can probably be done more efficiently with one SQL statement. -
SQL for join table problem?
hi morning,
my problem also haven find out the solution,can help me solve.
I got one part of register student to exam,during that part is like that.
Student Code:________(table3)
Exam Code:_________(table 3)
Student Name:________(table 1)
Exam Name:_________(table 2)
I can write code call table 3 but when three table join together in part 3,got problem is come out alry....The problem is inside the Student Name & Exam Name.When i use the button for NEXTRECORD to check record,cannot call the student Name & exam Name.
Thank for help. Because i use sql code to call table 3 to check table1 and table 2 detail ,then retrive that data.
my code is like that,
private void cmd_NexRec_RSEActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
int i;
i=0;
try{
String x1,x2;
x1=(jTextField10.getText()).trim();
x2=(jTextField11.getText()).trim();
if (x1.equals("")&& x2.equals("") )
counter.studentExam="R";
counter.registerStudentExam="N";
i++;
jInternalFrame8.setVisible(false);
Connection con = getConnection2();
Statement s = con.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs=getStudentExams();
ResultSet rs1=getCodes();
ResultSet rs2=getExams();
String select="select * from studentExamFile a LEFT JOIN {studentData b} ON a.student_code=b.student_code LEFT JOIN {exam c} ON c.exam_code=a.exam_code where student_code='"+ x1 +"' and exam_code='"+ x2 +"'" ;
// String select ="select * from studentExamFile , exam , studentData where studentExamFile.student_code=studentData.student_code and exam.exam_code=studentExamFile.exam_code ";
// rs = s.executeQuery(select);
rs.next();
StudentExam c=getstudentcode(rs);
Code c1=getCode(rs1);
Examcode c2=getexamcode(rs2);
jTextField12.setText(c.studentcode);
jTextField13.setText(c.examcode);
jTextField14.setText(rs.getString("c1.name"));
jTextField15.setText(rs.getString("c2.ename"));
// jTextField14.setText(c1.name);
// jTextField14.setText(c2.ename);
jLabel16.setText("Record: Review");
jInternalFrame10.setVisible(true);
jTextField12.setEnabled(false);
jTextField13.setEnabled(false);
//New Line
jTextField14.requestFocus();
else
Connection con = getConnection2();
Statement s = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
String w=(jTextField10.getText()).trim();
String w2=(jTextField11.getText()).trim();
//String select= "select * from [studentExamFile] where [student_code]>'" w "'";
// String select1="select * from [studentExamFile] where [exam_code]>'" w2 "'";
String select="select * from studentExamFile a LEFT JOIN {studentData b} ON a.student_code=b.student_code LEFT JOIN {exam c} ON c.exam_code=a.exam_code where student_code='"+ x1 +"' and exam_code='"+ x2 +"'" ;
ResultSet rs;
rs = s.executeQuery(select);
// rs = s.executeQuery(select1);
rs.next();
if(rs.isFirst())
counter.registerStudentExam="N";
jInternalFrame8.setVisible(false);
jTextField12.setText(rs.getString(1));
jTextField13.setText(rs.getString(2));
jLabel16.setText("Record: Review");
jInternalFrame10.setVisible(true);
jTextField12.setEnabled(false);
jTextField13.setEnabled(false);
//New Line
jTextField14.requestFocus();
counter.studentExam="R";
else
JOptionPane.showMessageDialog(this,"End of the file ","Infomation",JOptionPane.INFORMATION_MESSAGE);
}catch(SQLException e)
System.out.println("Error");
//jTextField3.requestFocus();
}thanks for reply.
i think my problem is in connection to database .
String sql="select studentData.student_name, exam.exam_name from studentData,exam,studentExamFile where studentData.student_code=studentExamFile.student_code and exam.exam_code=studentExamFile.exam_code ";
// String sql="select studentData.student_name , exam.exam_name from studentExamFile LEFT JOIN { studentData } ON studentExamFile.student_code=studentData.student_code LEFT JOIN { exam } ON exam.exam_code=studentExamFile.exam_code ";
Connection con = getConnection();
Statement s = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
Connection con2 = getConnection();
Statement s3 = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
System.out.println("error");//my problem inside here....help me
rs3=s.executeQuery(sql);
rs3=s3.executeQuery(sql);
rs3.next();
String s1,s2;
s1=rs3.getString(1);//maybe me dunno how to convert the sql data...
s2=rs3.getString(2);
rs.next();
rs2.next();
// rs3.next();
Code c=getCode(rs);
Examcode c2=getexamcode(rs2);
StudentExam c3=getstudentcode(rs3);
jTextField12.setText(c3.studentcode);
jTextField13.setText(c3.examcode);
// jTextField14.setText(rs.getString("c.name"));
//jTextField15.setText(rs.getString("c2.ename"));
jTextField14.setText(s1);
jTextField15.setText(s2);
jLabel16.setText("Record: Review");
jInternalFrame10.setVisible(true);
jTextField12.setEnabled(false);
//New Line
jTextField14.requestFocus(); -
SQL Join Three Tables DW MX2004 ASP
I'm trying to display records using three tables joined as
shown in the SQL code below. I'm getting "no data" message when I
test the result page from the search form. I'm using the advanced
Dreamweaver form to enter the SQL commands. I have never used this
feature of Dreamweaver before and I'm not sure if the code below
follows the way DW MX will understand what I'm trying to do. Below
is the code based on Standard SQL....not sure if DW compatible...
This is what I typed in the SQL box:
SELECT
ResourceSkillMapping.resourceSkillMapID,ResourceSkillMapping.skillID,
ResourceSkillMapping.competenceLevel,skill.skillname,resource.resourceName,resource.resour ceLoginId
FROM ResourceSkillMapping INNER JOIN Skill ON
ResourceSkillMapping.skillID = Skill.skillID
INNER JOIN Resource ON
ResourceSkillMapping.resourceSkillMapID =
Resource.resourceSkillMapID
WHERE (Skill.skillName = '%Skill_asp%') AND
(Resource.resourceLoginID = '%Agent_asp%')
AND (Resource.active = 1)
These is typed in the variables box:
Variable Default Runtime
Skill_asp 1 Request.QueryString("skillname")
Agent_asp 1 Request.QueryString("resourceLoginID")
I'm using asp and the "Get" url parameters in the search form
calling the result recordset in DW. I'm connecting to a SQL 2000
server. Is this notation DW correct? Am I joining the tables
correctly. The tables are ResourceSkillMapping, Skill and Resource.
All I need is to be able to search by ResourceLoginID and by
skillName on all active records (active=1). The plan is to be able
to click on a result record and go to a detail page to update the
"CompetencyLevel" field in the resourceSkillMapping table using the
update behavior in DW.
Please help as this project is due this Tue and have been
trying every posibility I could think so far....I have read all the
DW help facilities many pages on this and still keep getting the
"no data" message
Thank you,
Carlos
[email protected]>> WHERE (Skill.skillName = '%Skill_asp%') AND
(Resource.resourceLoginID =
>>'%Agent_asp%')
I would say that this is where your problem is. Change it to:
WHERE (Skill.skillName LIKE '%Skill_asp%') AND
(Resource.resourceLoginID
LIKE
'%Agent_asp%')
and your query should work, unless of course you are actually
searching for
2 strings that read %Skill_asp% and %Agent_asp% exactly.
Pat.
"ITCoreTeam" <[email protected]> wrote in
message
news:[email protected]...
> I'm trying to display records using three tables joined
as shown in the
> SQL
> code below. I'm getting "no data" message when I test
the result page from
> the
> search form. I'm using the advanced Dreamweaver form to
enter the SQL
> commands.
> I have never used this feature of Dreamweaver before and
I'm not sure if
> the
> code below follows the way DW MX will understand what
I'm trying to do.
> Below
> is the code based on Standard SQL....not sure if DW
compatible...
> This is what I typed in the SQL box:
>
> SELECT
>
ResourceSkillMapping.resourceSkillMapID,ResourceSkillMapping.skillID,
>
>
ResourceSkillMapping.competenceLevel,skill.skillname,resource.resourceName,resou
> rce.resourceLoginId
> FROM ResourceSkillMapping INNER JOIN Skill ON
ResourceSkillMapping.skillID
> =
> Skill.skillID
> INNER JOIN Resource ON
ResourceSkillMapping.resourceSkillMapID =
> Resource.resourceSkillMapID
> WHERE (Skill.skillName = '%Skill_asp%') AND
(Resource.resourceLoginID =
> '%Agent_asp%')
> AND (Resource.active = 1)
>
> These is typed in the variables box:
> Variable Default Runtime
> Skill_asp 1 Request.QueryString("skillname")
> Agent_asp 1 Request.QueryString("resourceLoginID")
>
> I'm using asp and the "Get" url parameters in the search
form calling the
> result recordset in DW. I'm connecting to a SQL 2000
server. Is this
> notation
> DW correct? Am I joining the tables correctly. The
tables are
> ResourceSkillMapping, Skill and Resource. All I need is
to be able to
> search by
> ResourceLoginID and by skillName on all active records
(active=1). The
> plan is
> to be able to click on a result record and go to a
detail page to update
> the
> "CompetencyLevel" field in the resourceSkillMapping
table using the update
> behavior in DW.
> Please help as this project is due this Tue and have
been trying every
> posibility I could think so far....I have read all the
DW help facilities
> many
> pages on this and still keep getting the "no data"
message
> Thank you,
> Carlos
> [email protected]
> -
SQL Join Three Tables DW MX2004
I'm trying to display records using three tables joined as
shown in the SQL code below. I'm getting "no data" message when I
test the result page from the search form. I'm using the advanced
Dreamweaver form to enter the SQL commands. I have never used this
feature of Dreamweaver before and I'm not sure if the code below
follows the way DW MX will understand what I'm trying to do. Below
is the code based on Standard SQL....not sure if DW compatible...
This is what I typed in the SQL box:
SELECT
ResourceSkillMapping.resourceSkillMapID,ResourceSkillMapping.skillID,
ResourceSkillMapping.competenceLevel,skill.skillname,resource.resourceName,resource.resour ceLoginId
FROM ResourceSkillMapping INNER JOIN Skill ON
ResourceSkillMapping.skillID = Skill.skillID
INNER JOIN Resource ON
ResourceSkillMapping.resourceSkillMapID =
Resource.resourceSkillMapID
WHERE (Skill.skillName = '%Skill_asp%') AND
(Resource.resourceLoginID = '%Agent_asp%')
AND (Resource.active = 1)
These is typed in the variables box:
Variable Default Runtime
Skill_asp 1 Request.QueryString("skillname")
Agent_asp 1 Request.QueryString("resourceLoginID")
I'm using asp and the "Get" url parameters in the search form
calling the result recordset in DW. I'm connecting to a SQL 2000
server. Is this notation DW correct? Am I joining the tables
correctly. The tables are ResourceSkillMapping, Skill and Resource.
All I need is to be able to search by ResourceLoginID and by
skillName on all active records (active=1). The plan is to be able
to click on a result record and go to a detail page to update the
"CompetencyLevel" field in the resourceSkillMapping table using the
update behavior in DW.
Please help as this project is due this Tue and have been
trying every posibility I could think so far....I have read all the
DW help facilities many pages on this and still keep getting the
"no data" message
Thank you,
Carlos
[email protected]I'm trying to display records using three tables joined as
shown in the SQL code below. I'm getting "no data" message when I
test the result page from the search form. I'm using the advanced
Dreamweaver form to enter the SQL commands. I have never used this
feature of Dreamweaver before and I'm not sure if the code below
follows the way DW MX will understand what I'm trying to do. Below
is the code based on Standard SQL....not sure if DW compatible...
This is what I typed in the SQL box:
SELECT
ResourceSkillMapping.resourceSkillMapID,ResourceSkillMapping.skillID,
ResourceSkillMapping.competenceLevel,skill.skillname,resource.resourceName,resource.resour ceLoginId
FROM ResourceSkillMapping INNER JOIN Skill ON
ResourceSkillMapping.skillID = Skill.skillID
INNER JOIN Resource ON
ResourceSkillMapping.resourceSkillMapID =
Resource.resourceSkillMapID
WHERE (Skill.skillName = '%Skill_asp%') AND
(Resource.resourceLoginID = '%Agent_asp%')
AND (Resource.active = 1)
These is typed in the variables box:
Variable Default Runtime
Skill_asp 1 Request.QueryString("skillname")
Agent_asp 1 Request.QueryString("resourceLoginID")
I'm using asp and the "Get" url parameters in the search form
calling the result recordset in DW. I'm connecting to a SQL 2000
server. Is this notation DW correct? Am I joining the tables
correctly. The tables are ResourceSkillMapping, Skill and Resource.
All I need is to be able to search by ResourceLoginID and by
skillName on all active records (active=1). The plan is to be able
to click on a result record and go to a detail page to update the
"CompetencyLevel" field in the resourceSkillMapping table using the
update behavior in DW.
Please help as this project is due this Tue and have been
trying every posibility I could think so far....I have read all the
DW help facilities many pages on this and still keep getting the
"no data" message
Thank you,
Carlos
[email protected] -
Joining two tables in PL/SQL
Hi there,
I have two problems...first being:
We are trying to run a sub-query within a WHERE/AND clause. I am not sure on the correct syntax on how to run the sub-query as denoted in the code below. Secondly I am trying to join two tables with a common column name (ie: CIPIDI_NR). Considering I cant fix the first problem I cant test out the sub-query. So any help on either would be grateful. Cheers
Select *
from TBL_CIPIDI
WHERE CIPIDI_NR like nvl ('in_case_number%', CIPIDI_NR)
AND CIPIDI_NAME like nvl ('in_case_name%', CIPIDI_NAME)
AND COST_CENTRE LIKE NVL ('in_cost_centre%', COST_CENTRE)
AND CIPIDI_DESCRIPTION like nvl ('in_description%', CIPIDI_DESCRIPTION)
AND CLAIMANT_NAME LIKE NVL ('in_claimant%', CLAIMANT_NAME)
AND REQUESTOR LIKE NVL ('in_requestor%', REQUESTOR)
AND PROJECT_MANAGER LIKE NVL ('in_project_manager%', PROJECT_MANAGER)
AND TEAM_LEADER LIKE NVL ('in_team_leader%', TEAM_LEADER)
AND ********RUN THE QUERY BELOW************
SELECT C1.CIPIDI_NR, C2.CIPIDI_NR
from TBL_TEAM_MEMBERS C1, TBL_CIPIDI C2
WHERE C1.CIPIDI_NR = C2.CIPIDI_NR
AND TEAM_MEM_NAME LIKE NVL ('in_team_mem_name%', TEAM_MEM_NAME)
);You really need to start providing create table and insert statements for tables and sample data for testing, the results that you want based on that data in order to clarify the problem, your Oracle version, and a copy and paste of an attempted run of your code, complete with any error messages received. The following is my best guess at what you might be looking for.
Select *
from TBL_TEAM_MEMBERS C1, TBL_CIPIDI C2
WHERE C1.CIPIDI_NR = C2.CIPIDI_NR
AND c1.CIPIDI_NR like nvl (in_case_number || '%', c1.CIPIDI_NR)
AND c1.CIPIDI_NAME like nvl (in_case_name || '%', c1.CIPIDI_NAME)
AND c1.COST_CENTRE LIKE NVL (in_cost_centre || '%', c1.COST_CENTRE)
AND c1.CIPIDI_DESCRIPTION like nvl (in_description || '%', c1.CIPIDI_DESCRIPTION)
AND c1.CLAIMANT_NAME LIKE NVL (in_claimant || '%', c1.CLAIMANT_NAME)
AND c1.REQUESTOR LIKE NVL (in_requestor || '%', c1.REQUESTOR)
AND c1.PROJECT_MANAGER LIKE NVL (in_project_manager || '%', c1.PROJECT_MANAGER)
AND c1.TEAM_LEADER LIKE NVL (in_team_leader || '%', c1.TEAM_LEADER)
AND TEAM_MEM_NAME LIKE NVL (in_team_mem_name || '%', TEAM_MEM_NAME); -
I am trying to develop a query in MS Access 2010 to join two tables using three joins, one of which is a (between) date range. The tables are contained in Access. The reason
the tables are contained in access because they are imported from different ODBC warehouses and the data is formatted for uniformity. I believe this cannot be developed using MS Visual Query Designer. I think writing a query in SQL would be suiting this project.
ABCPART links to XYZPART. ABCSERIAL links to XYZSERIAL. ABCDATE links to (between) XYZDATE1 and ZYZDATE2.
[ABCTABLE]
ABCORDER
ABCPART
ABCSERIAL
ABCDATE
[ZYXTABLE]
XYZORDER
XYZPART
XYZSERIAL
XYZDATE1
XYZDATE2Thank you for the looking at the post. The actual table names are rather ambiguous. I renamed them so it would make more sense. I will explain more and give the actual names. What I do not have is the actual data in the table. That is something I don't have
on this computer. There are no "Null" fields in either of the tables.
This table has many orders (MSORDER) that need to match one order (GLORDER) in GLORDR. This is based on MSPART joined to GLPART, MSSERIAL joined to GLSERIAL, and MSOPNDATE joined if it falls between GLSTARTDATE and GLENDDATE.
[MSORDR]
MSORDER
MSPART
MSSERIAL
MSOPNDATE
11111111
4444444
55555
2/4/2015
22222222
6666666
11111
1/6/2015
33333333
6666666
11111
3/5/2015
This table has one order for every part number and every serial number.
[GLORDR]
GLORDER
GLPART
GLSERIAL
GLSTARTDATE
GLENDDATE
ABC11111
444444
55555
1/2/2015
4/4/2015
ABC22222
666666
11111
1/5/2015
4/10/2015
AAA11111
555555
22222
3/2/2015
4/10/2015
Post Query table
GLORDER
MSORDER
GLSTARTDATE
GLENDDATE
MSOPNDATE
ABC11111
11111111
1/2/2015
4/4/2015
2/4/2015
ABC22222
22222222
1/5/2015
4/10/2015
1/6/2015
ABC22222
33333333
1/5/2015
4/10/2015
3/5/2015
This is the SQL minus the between date join.
SELECT GLORDR.GLORDER, MSORDR.MSORDER, GLORDR.GLSTARTDATE, GLORDR.GLENDDATE, MSORDR.MSOPNDATE
FROM GLORDR INNER JOIN MSORDR ON (GLORDR.GLSERIAL = MSORDR.MSSERIAL) AND (GLORDR.GLPART = MSORDR.MSPART); -
I have to join 18 tables,.. Is it best to join all 18 in a single shot or to go with
multi stages-- 9 tables in one stage and after that anotther 9 tables..
Please anyone give me a good suggestion on this with some reason...
Thanks in advanceIf you can look at your query and recognise that it is trying to collect (say) two small result sets and then join the result sets, then it is actually a good idea to express the query in that fashion to Oracle.
Take for example a query that sums last week's profits for a supermarket by department using a 9 table query in about 2 minutes. A similar query reports the previous week's profits with a marginally different query in about two minutes. You write the two queries as inline views and join them to report the percentage change in profit by department - and the query takes 4 hours because Oracle has used "complex view merging" to turn your two 9-table queries into a single 18-table query.
In this case, a workaround is to use the /*+ no_merge */ hint. In outline, something like:
select {columns}
from
select /*+ no_merge */
dept_no,
etc.
from ...
) lw,
select /*+ no_merge */
dept_no,
etc.
from ...
) pw
where
pw.dept_no = lw.dept_no
;In less obvious cases you may still be able to find that you can break up a big query into a few smaller, logical sections, and use this technique to generate and join what are, in effect, intermediate results.
An alternative to the /*+ no_merge */ hint is to use subquery factoring to the same end. There's a more complex example of the method here: http://jonathanlewis.wordpress.com/2007/07/01/internet-sql/
In either case, avoid turning your 18-table query into 18 separate pieces and sticking them back together - it may make the optimizer do some very silly things. Karen Morton mentions an example of this on her blog: http://karenmorton.blogspot.com/2008/06/dont-do-work-you-dont-have-to-do.html
Regards
Jonathan Lewis
http://jonathanlewis.wordpress.com
http://www.jlcomp.demon.co.uk
"The greatest enemy of knowledge is not ignorance,
it is the illusion of knowledge." (Stephen Hawking) -
Hi All
below query giving me error in query generator but working well in Sql server.
error: [Microsoft][SQL Server Native Client 10.0][SQL Server]Must specify table to select from. '' (SWEI)
Select
T1.U_grp01 As 'BA',T3.DocDate As 'Posting Date',Month(T3.DocDate) As 'PostMonth',Year(T3.DocDate) As 'PostYear',
'AR Invoice' As 'Type',T3.DocNum As 'Doc No',T3.CardCode As 'Cust. Code',T3.CardName As 'Cust. Name',T5.SlpName As 'Sale Emp. Name',
T4.IndustryC As 'Channel Type',T6.CityB As 'BillToCity',T7.Name As 'BillToState',T6.CityS As 'ShipToCity',T8.Name As 'ShipToState',
T4.U_Une_Zone As 'Zone',
T2.ItmsGrpNam As 'L1',T0.LineNum As 'Row No',T0.ItemCode As 'ItemCode',T0.Dscription As 'Item Name',t0.whscode,
T0.Quantity As 'Quantity',T0.StockPrice As 'COGS Price',IsNull(Sum(T0.Quantity * T0.StockPrice),0) As 'COGS Value',T0.VatSum As 'Tax Amount',
IsNull((Case When T3.DocType='I' Then (Case When T0.Currency = 'INR' Then T0.PriceBefDi Else (T0.PriceBefDi * T0.Rate) End) Else T0.Price End) ,0) As 'Sales Price',
IsNull((Case When T3.DocType='I' Then (Case When T0.Currency = 'INR' Then T0.INMPrice Else (T0.INMPrice * T0.Rate) End) Else T0.Price End) ,0) As 'Sales Price',
IsNull((Case When T3.DocType='I' Then (Case When T0.Currency = 'INR' Then Sum(T0.Quantity * T0.INMPrice) Else Sum(T0.Quantity * T0.INMPrice * T0.Rate) End) Else T0.LineTotal End) ,0) As 'Sales Value',t9.linetotal as 'Freight',
T3.DocType As 'DocType',
(SELECT DISTINCT ISNULL (SUM(INV4.TaxSum),0)
FROM INV4
WHERE INV4.StaType = -90
AND INV4.DocEntry = T3.DocEntry
AND INV4.LineNum = T0.LineNum) AS 'BED',
(SELECT DISTINCT ISNULL (SUM(INV4.TaxSum),0)
FROM INV4
WHERE INV4.StaType = -60
AND INV4.DocEntry = T3.DocEntry
AND INV4.LineNum = T0.LineNum) AS 'Cess',
(SELECT DISTINCT ISNULL (SUM(INV4.TaxSum),0)
FROM INV4
WHERE INV4.StaType = 9
AND INV4.DocEntry = T3.DocEntry
AND INV4.LineNum = T0.LineNum) AS 'HeCess',
(SELECT DISTINCT ISNULL (SUM(INV4.TaxSum),0)
FROM INV4
WHERE (INV4.StaType = 1 or inv4.staType = 8)
AND INV4.DocEntry = T3.DocEntry
AND INV4.LineNum = T0.LineNum) AS 'VAT',
(SELECT DISTINCT ISNULL (SUM(INV4.TaxSum),0)
FROM INV4
WHERE INV4.StaType = 8
AND INV4.DocEntry = T3.DocEntry
AND INV4.LineNum = T0.LineNum) AS 'CST'
From INV1 T0
Left Join OITM T1 On T1.ItemCode=T0.ItemCode
Left Join OITB T2 On T2.ItmsGrpCod=T1.ItmsGrpCod
Left Join OINV T3 On T3.DocEntry=T0.DocEntry
Left Join OCRD T4 On T4.CardCode=T3.CardCode
Left Join OSLP T5 On T5.SlpCode=T4.SlpCode
Left Join INV12 T6 On T6.DocEntry=T0.DocEntry
Left Join OCST T7 On T7.Code=T6.StateB and T7.Country='IN'
Left Join OCST T8 On T8.Code=T6.StateS and T8.Country='IN'
left join inv3 t9 on t9.docentry = t3.docentry
WHERE T3.[DocDate] >= [%0] and T3.[DocDate] <= [%1] and t3.U_UNE_GCAT = '2'
Group By T1.U_grp01,T3.DocEntry,T3.DocNum,T3.DocDate,T0.LineNum,T3.CardCode,T3.CardName,T5.SlpName,T4.IndustryC,T4.U_Une_Zone,
T6.CityB,T7.Name,T6.CityS,T8.Name,T0.VatSum,T0.Currency,T0.Rate,T3.DocType,T0.Price,T0.LineTotal,
T2.ItmsGrpNam,T0.ItemCode,T0.Dscription,T0.StockPrice,T0.INMPrice,T0.PriceBefDi,T0.Quantity,t9.linetotal,t0.WhsCode
Union All
Select
T1.U_grp01 As 'BA',T3.DocDate As 'Posting Date',Month(T3.DocDate) As 'PostMonth',Year(T3.DocDate) As 'PostYear',
'AR Invoice' As 'Type',T3.DocNum As 'Doc No',T3.CardCode As 'Cust. Code',T3.CardName As 'Cust. Name',T5.SlpName As 'Sale Emp. Name',
T4.IndustryC As 'Channel Type',T6.CityB As 'BillToCity',T7.Name As 'BillToState',T6.CityS As 'ShipToCity',T8.Name As 'ShipToState',
T4.U_Une_Zone As 'Zone',
T2.ItmsGrpNam As 'L1',T0.LineNum As 'Row No',T0.ItemCode As 'ItemCode',T0.Dscription As 'Item Name',t0.whscode,
T0.Quantity As 'Quantity',T0.StockPrice As 'COGS Price',IsNull(Sum(T0.Quantity * T0.StockPrice),0) As 'COGS Value',T0.VatSum As 'Tax Amount',
IsNull((Case When T3.DocType='I' Then (Case When T0.Currency = 'INR' Then T0.PriceBefDi Else (T0.PriceBefDi * T0.Rate) End) Else T0.Price End) ,0) As 'Sales Price',
IsNull((Case When T3.DocType='I' Then (Case When T0.Currency = 'INR' Then T0.INMPrice Else (T0.INMPrice * T0.Rate) End) Else T0.Price End) ,0) As 'Sales Price',
IsNull((Case When T3.DocType='I' Then (Case When T0.Currency = 'INR' Then Sum(T0.Quantity * T0.INMPrice) Else Sum(T0.Quantity * T0.INMPrice * T0.Rate) End) Else T0.LineTotal End) ,0) As 'Sales Value',t9.linetotal as 'Freight',
T3.DocType As 'DocType',
(SELECT DISTINCT ISNULL (SUM(rin4.TaxSum),0)
FROM rin4
WHERE rin4.StaType = -90
AND rin4.DocEntry = T3.DocEntry
AND rin4.LineNum = T0.LineNum) AS 'BED',
(SELECT DISTINCT ISNULL (SUM(rin4.TaxSum),0)
FROM rin4
WHERE rin4.StaType = -60
AND rin4.DocEntry = T3.DocEntry
AND rin4.LineNum = T0.LineNum) AS 'Cess',
(SELECT DISTINCT ISNULL (SUM(rin4.TaxSum),0)
FROM rin4
WHERE rin4.StaType = 9
AND rin4.DocEntry = T3.DocEntry
AND rin4.LineNum = T0.LineNum) AS 'HeCess',
(SELECT DISTINCT ISNULL (SUM(rin4.TaxSum),0)
FROM rin4
WHERE (rin4.StaType = 1 or rin4.staType = 8)
AND rin4.DocEntry = T3.DocEntry
AND rin4.LineNum = T0.LineNum) AS 'VAT',
(SELECT DISTINCT ISNULL (SUM(rin4.TaxSum),0)
FROM rin4
WHERE rin4.StaType = 8
AND rin4.DocEntry = T3.DocEntry
AND rin4.LineNum = T0.LineNum) AS 'CST'
From rin1 T0
Left Join OITM T1 On T1.ItemCode=T0.ItemCode
Left Join OITB T2 On T2.ItmsGrpCod=T1.ItmsGrpCod
Left Join Orin T3 On T3.DocEntry=T0.DocEntry
Left Join OCRD T4 On T4.CardCode=T3.CardCode
Left Join OSLP T5 On T5.SlpCode=T4.SlpCode
Left Join rin12 T6 On T6.DocEntry=T0.DocEntry
Left Join OCST T7 On T7.Code=T6.StateB and T7.Country='IN'
Left Join OCST T8 On T8.Code=T6.StateS and T8.Country='IN'
left join rin3 t9 on t9.docentry = t3.docentry
WHERE T3.[DocDate] >= [%0] and T3.[DocDate] <= [%1] and t3.U_UNE_GCAT = '2'
Group By T1.U_grp01,T3.DocEntry,T3.DocNum,T3.DocDate,T0.LineNum,T3.CardCode,T3.CardName,T5.SlpName,T4.IndustryC,T4.U_Une_Zone,
T6.CityB,T7.Name,T6.CityS,T8.Name,T0.VatSum,T0.Currency,T0.Rate,T3.DocType,T0.Price,T0.LineTotal,
T2.ItmsGrpNam,T0.ItemCode,T0.Dscription,T0.StockPrice,T0.INMPrice,T0.PriceBefDi,T0.Quantity,t9.linetotal,t0.WhsCode
Thanks in AdvanceHi deepak..
try this
/* SELECT FROM OSRT P1 */
DECLARE @FROM AS DATE
/* WHERE */
SET @FROM = /* P1.FromDate */ '[%1]'
/* SELECT FROM OSRT P2 */
DECLARE @TO AS DATE
/* WHERE */
SET @TO = /* P2.ToDate */ '[%2]';
SELECT T1.U_grp01 AS 'BA',
T3.DocDate AS 'Posting Date',
MONTH(T3.DocDate) AS 'PostMonth',
YEAR(T3.DocDate) AS 'PostYear',
'AR Invoice' AS 'Type',
T3.DocNum AS 'Doc No',
T3.CardCode AS 'Cust. Code',
T3.CardName AS 'Cust. Name',
T5.SlpName AS 'Sale Emp. Name',
T4.IndustryC AS 'Channel Type',
T6.CityB AS 'BillToCity',
T7.Name AS 'BillToState',
T6.CityS AS 'ShipToCity',
T8.Name AS 'ShipToState',
T4.U_Une_Zone AS 'Zone',
T2.ItmsGrpNam AS 'L1',
T0.LineNum AS 'Row No',
T0.ItemCode AS 'ItemCode',
T0.Dscription AS 'Item Name',
t0.whscode,
T0.Quantity AS 'Quantity',
T0.StockPrice AS 'COGS Price',
ISNULL(SUM(T0.Quantity * T0.StockPrice), 0) AS 'COGS Value',
T0.VatSum AS 'Tax Amount',
ISNULL(
CASE
WHEN T3.DocType = 'I' THEN (
CASE
WHEN T0.Currency = 'INR' THEN T0.PriceBefDi
ELSE (T0.PriceBefDi * T0.Rate)
END
ELSE T0.Price
END
0
) AS 'Sales Price',
ISNULL(
CASE
WHEN T3.DocType = 'I' THEN (
CASE
WHEN T0.Currency = 'INR' THEN T0.INMPrice
ELSE (T0.INMPrice * T0.Rate)
END
ELSE T0.Price
END
0
) AS 'Sales Price',
ISNULL(
CASE
WHEN T3.DocType = 'I' THEN (
CASE
WHEN T0.Currency = 'INR' THEN SUM(T0.Quantity * T0.INMPrice)
ELSE SUM(T0.Quantity * T0.INMPrice * T0.Rate)
END
ELSE T0.LineTotal
END
0
) AS 'Sales Value',
t9.linetotal AS 'Freight',
T3.DocType AS 'DocType',
SELECT DISTINCT ISNULL(SUM(INV4.TaxSum), 0)
FROM INV4
WHERE INV4.StaType = -90
AND INV4.DocEntry = T3.DocEntry
AND INV4.LineNum = T0.LineNum
) AS 'BED',
SELECT DISTINCT ISNULL(SUM(INV4.TaxSum), 0)
FROM INV4
WHERE INV4.StaType = -60
AND INV4.DocEntry = T3.DocEntry
AND INV4.LineNum = T0.LineNum
) AS 'Cess',
SELECT DISTINCT ISNULL(SUM(INV4.TaxSum), 0)
FROM INV4
WHERE INV4.StaType = 9
AND INV4.DocEntry = T3.DocEntry
AND INV4.LineNum = T0.LineNum
) AS 'HeCess',
SELECT DISTINCT ISNULL(SUM(INV4.TaxSum), 0)
FROM INV4
WHERE (INV4.StaType = 1 OR inv4.staType = 8)
AND INV4.DocEntry = T3.DocEntry
AND INV4.LineNum = T0.LineNum
) AS 'VAT',
SELECT DISTINCT ISNULL(SUM(INV4.TaxSum), 0)
FROM INV4
WHERE INV4.StaType = 8
AND INV4.DocEntry = T3.DocEntry
AND INV4.LineNum = T0.LineNum
) AS 'CST'
FROM INV1 T0
LEFT JOIN OITM T1
ON T1.ItemCode = T0.ItemCode
LEFT JOIN OITB T2
ON T2.ItmsGrpCod = T1.ItmsGrpCod
LEFT JOIN OINV T3
ON T3.DocEntry = T0.DocEntry
LEFT JOIN OCRD T4
ON T4.CardCode = T3.CardCode
LEFT JOIN OSLP T5
ON T5.SlpCode = T4.SlpCode
LEFT JOIN INV12 T6
ON T6.DocEntry = T0.DocEntry
LEFT JOIN OCST T7
ON T7.Code = T6.StateB
AND T7.Country = 'IN'
LEFT JOIN OCST T8
ON T8.Code = T6.StateS
AND T8.Country = 'IN'
LEFT JOIN inv3 t9
ON t9.docentry = t3.docentry
WHERE T3.[DocDate] >= @FROM
AND T3.[DocDate] <= @TO
AND t3.U_UNE_GCAT = '2'
GROUP BY
T1.U_grp01,
T3.DocEntry,
T3.DocNum,
T3.DocDate,
T0.LineNum,
T3.CardCode,
T3.CardName,
T5.SlpName,
T4.IndustryC,
T4.U_Une_Zone,
T6.CityB,
T7.Name,
T6.CityS,
T8.Name,
T0.VatSum,
T0.Currency,
T0.Rate,
T3.DocType,
T0.Price,
T0.LineTotal,
T2.ItmsGrpNam,
T0.ItemCode,
T0.Dscription,
T0.StockPrice,
T0.INMPrice,
T0.PriceBefDi,
T0.Quantity,
t9.linetotal,
t0.WhsCode
UNION ALL
SELECT T1.U_grp01 AS 'BA',
T3.DocDate AS 'Posting Date',
MONTH(T3.DocDate) AS 'PostMonth',
YEAR(T3.DocDate) AS 'PostYear',
'AR Invoice' AS 'Type',
T3.DocNum AS 'Doc No',
T3.CardCode AS 'Cust. Code',
T3.CardName AS 'Cust. Name',
T5.SlpName AS 'Sale Emp. Name',
T4.IndustryC AS 'Channel Type',
T6.CityB AS 'BillToCity',
T7.Name AS 'BillToState',
T6.CityS AS 'ShipToCity',
T8.Name AS 'ShipToState',
T4.U_Une_Zone AS 'Zone',
T2.ItmsGrpNam AS 'L1',
T0.LineNum AS 'Row No',
T0.ItemCode AS 'ItemCode',
T0.Dscription AS 'Item Name',
t0.whscode,
T0.Quantity AS 'Quantity',
T0.StockPrice AS 'COGS Price',
ISNULL(SUM(T0.Quantity * T0.StockPrice), 0) AS 'COGS Value',
T0.VatSum AS 'Tax Amount',
ISNULL(
CASE
WHEN T3.DocType = 'I' THEN (
CASE
WHEN T0.Currency = 'INR' THEN T0.PriceBefDi
ELSE (T0.PriceBefDi * T0.Rate)
END
ELSE T0.Price
END
0
) AS 'Sales Price',
ISNULL(
CASE
WHEN T3.DocType = 'I' THEN (
CASE
WHEN T0.Currency = 'INR' THEN T0.INMPrice
ELSE (T0.INMPrice * T0.Rate)
END
ELSE T0.Price
END
0
) AS 'Sales Price',
ISNULL(
CASE
WHEN T3.DocType = 'I' THEN (
CASE
WHEN T0.Currency = 'INR' THEN SUM(T0.Quantity * T0.INMPrice)
ELSE SUM(T0.Quantity * T0.INMPrice * T0.Rate)
END
ELSE T0.LineTotal
END
0
) AS 'Sales Value',
t9.linetotal AS 'Freight',
T3.DocType AS 'DocType',
SELECT DISTINCT ISNULL(SUM(rin4.TaxSum), 0)
FROM rin4
WHERE rin4.StaType = -90
AND rin4.DocEntry = T3.DocEntry
AND rin4.LineNum = T0.LineNum
) AS 'BED',
SELECT DISTINCT ISNULL(SUM(rin4.TaxSum), 0)
FROM rin4
WHERE rin4.StaType = -60
AND rin4.DocEntry = T3.DocEntry
AND rin4.LineNum = T0.LineNum
) AS 'Cess',
SELECT DISTINCT ISNULL(SUM(rin4.TaxSum), 0)
FROM rin4
WHERE rin4.StaType = 9
AND rin4.DocEntry = T3.DocEntry
AND rin4.LineNum = T0.LineNum
) AS 'HeCess',
SELECT DISTINCT ISNULL(SUM(rin4.TaxSum), 0)
FROM rin4
WHERE (rin4.StaType = 1 OR rin4.staType = 8)
AND rin4.DocEntry = T3.DocEntry
AND rin4.LineNum = T0.LineNum
) AS 'VAT',
SELECT DISTINCT ISNULL(SUM(rin4.TaxSum), 0)
FROM rin4
WHERE rin4.StaType = 8
AND rin4.DocEntry = T3.DocEntry
AND rin4.LineNum = T0.LineNum
) AS 'CST'
FROM rin1 T0
LEFT JOIN OITM T1
ON T1.ItemCode = T0.ItemCode
LEFT JOIN OITB T2
ON T2.ItmsGrpCod = T1.ItmsGrpCod
LEFT JOIN [dbo].[Orin] T3
ON T3.DocEntry = T0.DocEntry
LEFT JOIN OCRD T4
ON T4.CardCode = T3.CardCode
LEFT JOIN OSLP T5
ON T5.SlpCode = T4.SlpCode
LEFT JOIN rin12 T6
ON T6.DocEntry = T0.DocEntry
LEFT JOIN OCST T7
ON T7.Code = T6.StateB
AND T7.Country = 'IN'
LEFT JOIN OCST T8
ON T8.Code = T6.StateS
AND T8.Country = 'IN'
LEFT JOIN rin3 t9
ON t9.docentry = t3.docentry
WHERE T3.[DocDate] >= @FROM
AND T3.[DocDate] <= @TO
AND t3.U_UNE_GCAT = '2'
GROUP BY
T1.U_grp01,
T3.DocEntry,
T3.DocNum,
T3.DocDate,
T0.LineNum,
T3.CardCode,
T3.CardName,
T5.SlpName,
T4.IndustryC,
T4.U_Une_Zone,
T6.CityB,
T7.Name,
T6.CityS,
T8.Name,
T0.VatSum,
T0.Currency,
T0.Rate,
T3.DocType,
T0.Price,
T0.LineTotal,
T2.ItmsGrpNam,
T0.ItemCode,
T0.Dscription,
T0.StockPrice,
T0.INMPrice,
T0.PriceBefDi,
T0.Quantity,
t9.linetotal,
t0.WhsCode
rgds
Kennedy -
Error while executing SQL query -' Must Specify Table to select from'
Hi all,
While executing query using query generator
it shows error message
[Microsoft][SQL Native Client][SQL Server]Must specify table to select from.
2). [Microsoft][SQL Nativ
SELECT T1.ItemCode, T1.Dscription AS 'Item Description', T1.Quantity, T1.Price, T1.LineTotal,
(Select SUM(T2.TaxSum) From PCH4 T2 Where T0.DocEntry=T2.DocEntry AND T2.staType=-90 AND T1.LineNum=T2.LineNum) as 'BEDAmt',
(Select SUM(T2.TaxSum) From PCH4 T2 Where T0.DocEntry=T2.DocEntry AND T2.staType=-60 AND T1.LineNum=T2.LineNum) as 'ECSAmt',
(Select SUM(T2.TaxSum) From PCH4 T2 Where T0.DocEntry=T2.DocEntry AND T2.staType=7 AND T1.LineNum=T2.LineNum) as 'HECSAmt',
(Select SUM(T2.TaxSum) From PCH4 T2 Where T0.DocEntry=T2.DocEntry AND T2.staType=1 AND T1.LineNum=T2.LineNum) as 'VATAmt',
(Select SUM(T2.TaxSum) From PCH4 T2 Where T0.DocEntry=T2.DocEntry AND T2.staType=4 AND T1.LineNum=T2.LineNum) as 'CSTAmt'
FROM dbo.[OPCH] T0 INNER JOIN PCH1 T1 ON T0.DocEntry = T1.DocEntry INNER JOIN PCH4 T2 ON T2.DocEntry=T0.DocEntry
WHERE T0.DocDate >='[%0]' AND T0.DocDate <='[%1]' AND T0.DocType = 'I'
GROUP BY T1.ItemCode,T1.Dscription,T1.Quantity, T1.Price, T1.LineTotal,T0.DocEntry,T1.DocEntry,T1.LineNum,T2.LineNum
It's executing fine in MS SQL Server Studio Management.
Please give y'r ideas to solve the problem.
Jeyakanthantry this, it works fine in my B1:
SELECT T1.ItemCode, T1.Dscription AS 'Item Description', T1.Quantity, T1.Price, T1.LineTotal,
(Select SUM(T2.TaxSum) From PCH4 T2 Where T0.DocEntry=T2.DocEntry AND T2.staType=-90 AND T1.LineNum=T2.LineNum) as 'BEDAmt',
(Select SUM(T2.TaxSum) From PCH4 T2 Where T0.DocEntry=T2.DocEntry AND T2.staType=-60 AND T1.LineNum=T2.LineNum) as 'ECSAmt',
(Select SUM(T2.TaxSum) From PCH4 T2 Where T0.DocEntry=T2.DocEntry AND T2.staType=7 AND T1.LineNum=T2.LineNum) as 'HECSAmt',
(Select SUM(T2.TaxSum) From PCH4 T2 Where T0.DocEntry=T2.DocEntry AND T2.staType=1 AND T1.LineNum=T2.LineNum) as 'VATAmt',
(Select SUM(T2.TaxSum) From PCH4 T2 Where T0.DocEntry=T2.DocEntry AND T2.staType=4 AND T1.LineNum=T2.LineNum) as 'CSTAmt'
FROM dbo.OPCH T0 INNER JOIN PCH1 T1 ON T0.DocEntry = T1.DocEntry INNER JOIN PCH4 T2 ON T2.DocEntry=T0.DocEntry
WHERE T0.DocDate >='[%0]' AND T0.DocDate <='[%1]' AND T0.DocType = 'I'
GROUP BY T1.ItemCode,T1.Dscription,T1.Quantity, T1.Price, T1.LineTotal,T0.DocEntry,T1.DocEntry,T1.LineNum,T2.LineNum
B1 don't like brackets!
Regards -
Help needed in using Pivot by joining 2 tables
Hello everyone,
I am very new to usage of Pivot that includes joining 2 tables. Below is the scenario and request your help in this regard.
Table1
ID1 Description
1 Stationary
2 Apparel
3 Home Decor
Note : ID1 is unique
Table2
ID2 ID1 Item
1 1 Book
2 1 Paper-A4
3 2 T-Shirt
4 1 Pencil
5 3 Flower Vase
Note : ID2 is unique
I am trying to get the below result set.
ID2 Stationary Apparel Home Decor
1 Book NULL NULL
2 Paper-A4 NULL NULL
3 NULL T-Shirt NULL
4 Pencil NULL NULL
5 NULL NULL Flower Vase
Please help in this regard.
Thanks in advance,
KiranJust guessing
SELECT id2,
CASE WHEN Description='Stationary'
THEN Item END [Stationary],
CASE WHEN Description='Apparel'
THEN Item END [Apparel],
CASE WHEN Description='Home
Decor' THEN Item END [ Home
Decor]
FROM t1 JOIN t2 ON t1.id1=t2.id1
Best Regards,Uri Dimant SQL Server MVP,
http://sqlblog.com/blogs/uri_dimant/
MS SQL optimization: MS SQL Development and Optimization
MS SQL Consulting:
Large scale of database and data cleansing
Remote DBA Services:
Improves MS SQL Database Performance
SQL Server Integration Services:
Business Intelligence -
Using functions in select statement(joining 5 tables) taking long time in Oracle
Hi,
I have created a query in oracle which joins 5 tables and uses two functions(function names are 'ca_concat' and 'ca_concat_noseq').
Query takes approximately 40 secs to execute around 12000 records. If I remove the functions from query it excutes within a second..
Note : I have used the oracle SQL Developer for testing the query.
It would be appriciated if anybody helps me to improve the perfomance of the query.
Below are the querie with and without functions:
1. Query with functions:
select
imsAuditEvent12.id as ID,
imsAuditEvent12.audit_time as AUDIT_TIME,
imsAuditEvent12.admin_dn as ADMIN_DN,
imsAuditEvent12.admin_name as ADMIN_NAME,
imsAuditEvent12.event_name as EVENT_NAME,
imsAuditEvent12.event_description as EVENT_DESCRIPTION,
imsAuditEvent12.event_state as EVENT_STATE,
imsAuditEvent12.envname as ENVNAME,
imsAuditTaskSession12.task_name as TASK_NAME,
imsAuditTaskSession12.id as TASK_ID,
imsAuditTaskSession12.task_description as TASK_DESCRIPTION,
imsAuditTaskSession12.task_priority as TASK_PRIORITY,
S1.OBJECT_ID,
S1.OBJECT_NAME as OBJECT_NAME,
S1.OBJECT_TYPE as OBJECT_TYPE,
S2.ATTRIBUTE_NAME as ATTRIBUTE_NAME,
S2.ATTRIBUTE_OLDVALUES as ATTRIBUTE_OLDVALUES,
S2.ATTRIBUTE_NEWVALUES as ATTRIBUTE_NEWVALUES,
S3.OBJECT_DN as OBJECT_DN,
S3.OBJECT_TYPE as IMSOBJECT_TYPE,
S3.CONTAINER_NAME as CONTAINER_NAME,
S3.CONTAINER_DN as CONTAINER_DN,
S3.CONTAINER_TYPE as CONTAINER_TYPE
from
imsAuditEvent12 LEFT JOIN imsAuditTaskSession12 ON imsAuditTaskSession12.id=imsAuditEvent12.tasksession_id LEFT JOIN
(select parent_event_id,
ca_concat('imsAuditEventObject12.parent_event_id',parent_event_id,'imsAuditEventObject12.object_name','imsAuditEventObject12') as OBJECT_NAME,
ca_concat('imsAuditEventObject12.parent_event_id',parent_event_id,'imsAuditEventObject12.object_type','imsAuditEventObject12') as OBJECT_TYPE,
ca_concat_noseq('imsAuditEventObject12.parent_event_id',parent_event_id,'imsAuditEventObject12.ID','imsAuditEventObject12') as OBJECT_ID
from
imsAuditEventObject12 group by parent_event_id) S1
ON imsAuditEvent12.id = S1.parent_event_id LEFT JOIN
(select
parent_object_id,
ca_concat('parent_object_id',parent_object_id,'attribute_name','imsauditobjectattributes12') as ATTRIBUTE_NAME,
ca_concat('parent_object_id',parent_object_id,'attribute_oldvalue','imsauditobjectattributes12') as ATTRIBUTE_OLDVALUES ,
ca_concat('parent_object_id',parent_object_id,'attribute_newvalue','imsauditobjectattributes12') as ATTRIBUTE_NEWVALUES
from
imsauditobjectattributes12 group by parent_object_id) S2
ON S1.OBJECT_ID = S2.parent_object_id LEFT JOIN
(select
parent_event_id,
ca_concat('parent_event_id',parent_event_id,'OBJECT_DN','imsauditobjectrelationship12') as OBJECT_DN,
ca_concat('parent_event_id',parent_event_id,'OBJECT_TYPE','imsauditobjectrelationship12') as OBJECT_TYPE ,
ca_concat('parent_event_id',parent_event_id,'CONTAINER_NAME','imsauditobjectrelationship12') as CONTAINER_NAME,
ca_concat('parent_event_id',parent_event_id,'CONTAINER_DN','imsauditobjectrelationship12') as CONTAINER_DN,
ca_concat('parent_event_id',parent_event_id,'CONTAINER_TYPE','imsauditobjectrelationship12') as CONTAINER_TYPE
from
imsauditobjectrelationship12 group by parent_event_id) S3
ON imsAuditEvent12.id =S3.parent_event_id where imsauditevent12.id > 0 and imsauditevent12.id <12000 order by imsauditevent12.id ASC;
2. Query without using functions:
select * from imsauditeventobject12 left join imsauditevent12 on imsauditeventobject12.id=imsauditevent12.id left join imsauditobjectattributes12 on imsauditeventobject12.id=imsauditobjectattributes12.parent_object_id left join imsaudittasksession12 on imsauditevent12.tasksession_id=imsaudittasksession12.id left join imsAuditObjectRelationship12 on imsAuditEvent12.id =imsAuditObjectRelationship12.parent_event_id where imsauditevent12.id >0 and imsauditevent12.id < 12000 order by imsauditevent12.id asc;
Thanks,
BadriHi,
Please find the below more information about the query.
DB version: Oracle 11g Enterprise Edition Release 11.2.0.1.0
Below are source of the functions:
create or replace function ca_concat( ca_key_name in varchar2,
ca_key_val in varchar2,
ca_other_col_name in varchar2,
ca_tname in varchar2 )
return varchar2
as
type rc is ref cursor;
l_str varchar2(32000);
l_sep varchar2(1);
l_val varchar2(32000);
l_count number(6);
l_cur rc;
begin
l_count :=1;
l_str := '';
open l_cur for 'select '|| ca_other_col_name ||'
from '|| ca_tname || '
where ' || ca_key_name || ' = '
using ca_key_val;
loop
fetch l_cur into l_val;
l_val := SUBSTR(l_val,0,102);
exit when (l_cur%notfound or l_count > 38);
l_str := l_str || l_sep || l_count || '.' || l_val;
l_sep := ',';
l_count := l_count + 1;
end loop;
close l_cur;
return l_str;
end;
create or replace function ca_concat_noseq( ca_key_name in varchar2,
ca_key_val in varchar2,
ca_other_col_name in varchar2,
ca_tname in varchar2 )
return varchar2
as
type rc is ref cursor;
l_str nvarchar2(32000);
l_sep varchar2(1);
l_val varchar2(32000);
l_count number(6);
l_cur rc;
begin
l_count :=1;
open l_cur for 'select '||ca_other_col_name||'
from '|| ca_tname || '
where ' || ca_key_name || ' = '
using ca_key_val;
loop
fetch l_cur into l_val;
exit when (l_cur%notfound or length(l_val)>3000 or l_count>1);
l_str := l_str || l_sep || l_val ;
l_sep := ',';
l_count := l_count + 1;
end loop;
close l_cur;
return l_str;
end;
Below are the tables structures:
DESC imsauditevent12;
Name Null Type
ID NOT NULL NUMBER
TASKSESSION_ID NOT NULL NUMBER
TASKSESSION_OID VARCHAR2(100)
PARENT_EVENT_OID VARCHAR2(100)
AUDIT_TIME NOT NULL TIMESTAMP(6)
EVENT_OID NOT NULL VARCHAR2(100)
ADMIN_DN NOT NULL VARCHAR2(512)
ADMIN_NAME VARCHAR2(255)
EVENT_NAME NOT NULL VARCHAR2(255)
EVENT_DESCRIPTION VARCHAR2(4000)
EVENT_STATE VARCHAR2(100)
ENVNAME NOT NULL VARCHAR2(100)
ENV_OID NOT NULL VARCHAR2(100)
DESC imsauditeventobject12;
Name Null Type
ID NOT NULL NUMBER
PARENT_EVENT_ID NOT NULL NUMBER
AUDIT_TIME NOT NULL TIMESTAMP(6)
OBJECT_TYPE NOT NULL VARCHAR2(100)
OBJECT_NAME VARCHAR2(255)
DESC imsauditobjectattributes12;
Name Null Type
ID NOT NULL NUMBER
PARENT_OBJECT_ID NOT NULL NUMBER
AUDIT_TIME NOT NULL TIMESTAMP(6)
DISPLAY_NAME VARCHAR2(255)
ATTRIBUTE_NAME NOT NULL VARCHAR2(255)
ATTRIBUTE_OLDVALUE VARCHAR2(4000)
ATTRIBUTE_NEWVALUE VARCHAR2(4000)
DESC imsaudittasksession12;
Name Null Type
ID NOT NULL NUMBER
PARENT_TS_OID VARCHAR2(100)
PARENT_EVENT_OID VARCHAR2(100)
AUDIT_TIME NOT NULL TIMESTAMP(6)
TASKSESSION_OID NOT NULL VARCHAR2(100)
ADMIN_DN NOT NULL VARCHAR2(512)
ADMIN_NAME VARCHAR2(255)
TASK_NAME VARCHAR2(255)
TASK_TAG NOT NULL VARCHAR2(255)
TASK_DESCRIPTION VARCHAR2(4000)
TASK_PRIORITY NUMBER
STATE NOT NULL VARCHAR2(100)
ENVNAME NOT NULL VARCHAR2(100)
ENV_OID NOT NULL VARCHAR2(100)
DESC imsAuditObjectRelationship12;
Name Null Type
ID NOT NULL NUMBER
PARENT_EVENT_ID NOT NULL NUMBER
AUDIT_TIME NOT NULL TIMESTAMP(6)
OBJECT_TYPE NOT NULL VARCHAR2(100)
OBJECT_DN NOT NULL VARCHAR2(512)
CONTAINER_TYPE NOT NULL VARCHAR2(100)
OBJECT_NAME NOT NULL VARCHAR2(255)
CONTAINER_NAME NOT NULL VARCHAR2(255)
CONTAINER_DN NOT NULL VARCHAR2(512)
OPERATION NOT NULL VARCHAR2(50)
Thanks,
Badri -
How do you join two tables from different Oracle schemas using a subquery
I am trying to join two tables from different Oracle schemas using a subquery. I can extract data from each of the tables without a problem. However, when I combine the select statements using a subquery I get the Oracle error *'ORA-00936: missing expression'*. Since each SELECT statement executes on its own without error I don't understand what is missing. The result set I am trying to get is to match up the LINE_ID from PDTABLE_12_1 in schema DD_12809 with the MAT_DESCRIPTION from table PDTABLE_201 in schema RA_12809.
The query is as follows:
sql = "SELECT [DD_12809].[PDTABLE_12_1].LINE_ID FROM [DD_12809].[PDTABLE_12_1] JOIN " _
+ "(SELECT [RA_12809].[PDTABLE_201].MAT_DESCRIPTION " _
+ "FROM [RA_12809].[PDTABLE_201]) AS FAB " _
+ "ON [DD_12809].[PDTABLE_12_1].PIPING_MATER_CLASS = FAB.PIPING_MATER_CLASS"
The format of the query is copied from a SQL programming manual.
I also tried executing the query using a straight JOIN on the two tables but got the same results. Any insight would be helpful. Thanks!
Edited by: user11338343 on Oct 19, 2009 6:55 AMI believe you are receiving the error because you are trying to JOIN on a column that doesn't exist. For example you are trying to join on FAB.PIPING_MATER_CLASS but that column does not exist in the subquery.
If you want to do a straight join without a subquery you could do the following
SELECT DD_12809.PDTABLE_12_1.LINE_ID
, FAB.MAT_DESCRIPTION
FROM DD_12809.PDTABLE_12_1
JOIN RA_12809.PDTABLE_201 AS FAB ON DD_12809.PDTABLE_12_1.PIPING_MATER_CLASS = FAB.PIPING_MATER_CLASS HTH!
Maybe you are looking for
-
Why is my "hide toolbar" in the View grayed out. I am not able to show the toolbar.
I cannot keep the Safari toolbar showing. The "Hide Toolbar" in the View tab is grayed out. Also, I cannot get the dock to not hide.
-
Use a checkbox to hide/show (toggle) another field
I have a form I am creating in Adobe Acrobat X. The form will ultimately be used as a data entry interface on iPads. I need to keep the form very simple but there is a lot of technical information the end users may need to help fill out the forms.
-
Can we show flash screen over the loaded HTML5 page in StageWebView for IOS?
Hi Guys, I want to show flash screen(let say abc.mxml) over loaded HTML5 page in StageWebView. But unable to show it. Even I want to interact with both pages ( flash and HTML5) bidirectionally. Can anyone help me out of this StageWebView issue? Thank
-
USB Mouse autosuspends after 2 seconds
Hello dear Community I have a problem with my USB mouse on my laptop. It autosuspends after 2 seconds when my laptop is on battery power. When AC is plugged in, the mouse works without problems normally. But sometimes (I couldn't find any underling r
-
Benefits of creating form functions in oracle apps
hi all i want to register a new form in oracle apps, why i need to create form function to every form i register? thanks