Solved

SQL Optimization for JOIN

Posted on 2007-04-11
2
457 Views
Last Modified: 2009-07-29
Is there a way in DB2 SQL that allows you to pick which table data will come from in a join? Example:

TABLE t_Employee (EmpID, Name, Status)
TABLE t_Acting (ActID, EmpID, JobTitle, Salary)
TABLE t_Current(CurrID, EmpID, JobTitle, Salary)

- Everyone (old and current) in the database, always has a record in t_Employee.
- Every employee who is currently working, always has a record in t_Current with foreign key EmpID,  Status = "Current"
- If an employee is currently acting in another position, they have a record in t_Acting with foreign key EmpID, Status = "Acting"

So if Emp A is working as a team-leader, Emp A has a record in t_Employee and t_Current with TEAM LEADER as job title.
If Emp B is working as a team-leader, but is currently acting as a Manager, Emp B's t_Current record will have him as TEAM LEADER in job title, however he will also have t_Acting record with MANAGER in  job title.

When I want to do a query of all currently working employees, but only list their name and job-title. If I query the above example, I want a result of:

Name, Status, JobTitle
Emp A, Working, TEAM LEADER
Emp B, Acting, MANAGER

I currently have a solution that works, but is terribly slow as there is 7600 records in the employee table.

What it is now (I'm querying specific Columns in this statement, but I omitted them here for simplicity):
SELECT * FROM t_Employee INNER JOIN ((SELECT * FROM t_Acting) UNION (SELECT * FROM t_Current WHERE EmpID NOT IN (SELECT EmpID FROM t_Acting))) INNER JOIN ... a couple other small tables.
0
Comment
Question by:DJmistral
2 Comments
 
LVL 50

Accepted Solution

by:
Lowfatspread earned 125 total points
ID: 18891802
select e.emp_id
        ,case when a.empid is null then 'Working' else 'Acting' end as Status
        ,coalesce(a.jobtitle,c.jobtitle) as jobtitle
from t_employee as e
left outer join t_acting as a
on e.emp_id = a.emp_id
inner join t_current as c
on a.emp_id=c.emp_id
order by ae.emp_id

0
 
LVL 45

Expert Comment

by:Kent Olsen
ID: 18891960
Hi DJ,

Joining 7,600 records is trivial.  You should see a sub-second response to this kind of query.

Lowfatspread's suggestion eliminates the derived tables.  (Generally a very good thing.)  It also generates a result set based on two joins that may well be the result of index scans.

Try Lowfatspread's query.  If this doesn't come back almost instantly you've got a problem that needs to be addressed.  Report back to us and if there's still an issue we'll help you to solve it.

0

Featured Post

How our DevOps Teams Maximize Uptime

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us. Read the use case whitepaper.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Recursive SQL in UDB/LUW (you can use 'recursive' and 'SQL' in the same sentence) A growing number of database queries lend themselves to recursive solutions.  It's not always easy to spot when recursion is called for, especially for people una…
Recursive SQL in UDB/LUW (it really isn't that hard to do) Recursive SQL is most often used to convert columns to rows or rows to columns.  A previous article described the process of converting rows to columns.  This article will build off of th…
Microsoft Active Directory, the widely used IT infrastructure, is known for its high risk of credential theft. The best way to test your Active Directory’s vulnerabilities to pass-the-ticket, pass-the-hash, privilege escalation, and malware attacks …
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…

807 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question