2011-04-29 37 views
0
SELECT  
    dbo.pi_employee.emp_firstname, dbo.pi_employee.emp_lastname, 
    dbo.pi_employee.emp_no, dbo.pi_employee.emp_cnic, 
    dbo.pi_employee.emp_currentadd, dbo.pi_employee.emp_cellph, 
    dbo.pi_employee.emp_birthday, pi_jobtitle_1.jobtitle_name, 
    dbo.pi_employee.emp_joindate, dbo.pi_education.edu_degree, 
    dbo.pi_education.edu_year, dbo.pi_employee.emp_pension, 
    dbo.pi_employee.emp_age, dbo.pi_employee.emp_service, 
    dbo.pi_employee.emp_terminate, dbo.pi_employee.emp_termdate, 
    dbo.pi_employee.emp_basicofpay, dbo.pi_employee.emp_terminationreason, 
    dbo.pi_employee.emp_terminationdate, dbo.pi_employee.emp_status, 
    dbo.pi_employee.emp_gender, dbo.pi_employee.emp_maritalstatus, 
    dbo.pi_employee.emp_paymethod, dbo.pi_employee.emp_leaveentitle, 
    dbo.pi_employee.emp_confirmation, dbo.pi_employee.emp_title, 
    dbo.pi_employee.emp_basicamount, dbo.pi_salgrade.salgrade_name, 
    dbo.tbl_emp_status.StatusName, dbo.pi_skills.skill_type, 
    dbo.pi_location.loc_name, pi_location_1.loc_name AS wcity, 
    dbo.pi_jobtitlehist.jthSaleGradetype, dbo.pi_workexp.exp_serperiod, 
    dbo.pi_employee.emp_domicile, dbo.pi_skills.skill_type AS Skill, 
    dbo.pi_skills.skill_exp, dbo.pi_education.edu_degree AS Degree, 
    dbo.pi_education.edu_uni, dbo.pi_education.edu_distinction, 
    dbo.pi_lochistory.lhstart_date, dbo.pi_lochistory.lhend_date 
FROM   
    dbo.pi_location 
RIGHT OUTER JOIN 
    dbo.pi_workexp 
RIGHT OUTER JOIN 
    dbo.pi_employee ON dbo.pi_workexp.emp_no = dbo.pi_employee.emp_no 
LEFT OUTER JOIN 
    dbo.pi_jobtitlehist ON dbo.pi_employee.emp_no = dbo.pi_jobtitlehist.emp_no ON 
        dbo.pi_location.loc_id = dbo.pi_employee.emp_location_id 
LEFT OUTER JOIN 
    dbo.pi_salgrade ON dbo.pi_employee.emp_salgrade_id = dbo.pi_salgrade.salgrade_id 
LEFT OUTER JOIN 
    dbo.tbl_emp_status ON dbo.pi_employee.emp_status = dbo.tbl_emp_status.StatusID 
LEFT OUTER JOIN 
    dbo.pi_skills ON dbo.pi_employee.emp_no = dbo.pi_skills.emp_no 
LEFT OUTER JOIN 
    dbo.pi_location AS pi_location_1 
INNER JOIN 
    dbo.pi_lochistory ON pi_location_1.loc_id = dbo.pi_lochistory.loc_id ON dbo.pi_employee.emp_no = dbo.pi_lochistory.emp_no 
LEFT OUTER JOIN 
    dbo.pi_education ON dbo.pi_employee.emp_no = dbo.pi_education.emp_no 
LEFT OUTER JOIN 
    dbo.pi_jobtitle AS pi_jobtitle_1 ON dbo.pi_employee.emp_jobtitle_id = pi_jobtitle_1.jobtitle_id 

我正在寫sql查詢來實現不同的場景,但問題是它會給出重複的值。我也寫了不同的命令,但結果是一樣的,任何人都可以幫助我解決這個問題。我的查詢的SQL問題


編輯 - 與表名相同的查詢中使用別名:

SELECT  
    em.emp_firstname, em.emp_lastname, 
    em.emp_no, em.emp_cnic, 
    em.emp_currentadd, em.emp_cellph, 
    em.emp_birthday, jt.jobtitle_name, 
    em.emp_joindate, ed.edu_degree, 
    ed.edu_year, em.emp_pension, 
    em.emp_age, em.emp_service, 
    em.emp_terminate, em.emp_termdate, 
    em.emp_basicofpay, em.emp_terminationreason, 
    em.emp_terminationdate, em.emp_status, 
    em.emp_gender, em.emp_maritalstatus, 
    em.emp_paymethod, em.emp_leaveentitle, 
    em.emp_confirmation, em.emp_title, 
    em.emp_basicamount, sg.salgrade_name, 
    es.StatusName, s.skill_type, 
    L.loc_name, L1.loc_name AS wcity, 
    jh.jthSaleGradetype, we.exp_serperiod, 
    em.emp_domicile, s.skill_type AS Skill, 
    s.skill_exp, ed.edu_degree AS Degree, 
    ed.edu_uni, ed.edu_distinction, 
    Lh.lhstart_date, Lh.lhend_date 
FROM   
    dbo.pi_location AS L 
RIGHT OUTER JOIN 
    dbo.pi_workexp AS we 
RIGHT OUTER JOIN 
    dbo.pi_employee AS em ON we.emp_no = em.emp_no 
LEFT OUTER JOIN 
    dbo.pi_jobtitlehist jh ON em.emp_no = jh.emp_no ON L.loc_id = em.emp_location_id 
LEFT OUTER JOIN 
    dbo.pi_salgrade AS sg ON em.emp_salgrade_id = sg.salgrade_id 
LEFT OUTER JOIN 
    dbo.tbl_emp_status AS es ON em.emp_status = es.StatusID 
LEFT OUTER JOIN 
    dbo.pi_skills AS s ON em.emp_no = s.emp_no 
LEFT OUTER JOIN 
    dbo.pi_location AS L1 
INNER JOIN 
    dbo.pi_lochistory AS Lh ON L1.loc_id = Lh.loc_id ON em.emp_no = Lh.emp_no 
LEFT OUTER JOIN 
    dbo.pi_education ed ON em.emp_no = ed.emp_no 
LEFT OUTER JOIN 
    dbo.pi_jobtitle AS j ON em.emp_jobtitle_id = j.jobtitle_id 
+2

請重新格式化以使此查詢可讀 - 並且如果您可以說明哪些值重複,那將更有幫助! – 2011-04-29 07:19:10

+0

10個連接?你確定你需要那麼多嗎? – Oded 2011-04-29 07:20:39

+1

您需要爲所有JOIN指定一個「ON ......」子句 - 這是從很多JOIN中缺少的。另外:**請使用表別名!! **它使閱讀這樣一個巨大的聲明只是更容易! – 2011-04-29 07:29:00

回答

0

呀,因爲你正在做一個廢話噸笛卡爾乘積與那些沒有加入對條款,這將導致大量的看起來像是「重複的價值」,但實際上它們只是兩個組合集合的結果。

+1

你錯了。每個JOIN都有其相應的ON子句。它不是那麼明顯,因爲一些連接看起來像這樣:'... table0 JOIN table1 JOIN table2 ON condition2 ON condition1 ...'。這是SQL Server中的有效語法,只是在沒有括號的情況下略顯晦澀。 (與此相比:'... table0 JOIN(table1 JOIN table2 ON condition2)ON condition1 ...',即您實際上將另一個連接的結果加回到最左邊的表中。) – 2011-04-29 19:23:07

+0

SQL server?那就解釋了我對這個縫隙的無知。 Oracle和我的唯一。 – ryebr3ad 2011-05-02 15:03:04

+0

@Andiry M可以幫我糾正它 – Umair 2011-05-04 10:07:36