我的查询有Sql问题

我的查询有Sql问题,sql,Sql,我编写sql查询是为了实现不同的场景,但问题是它会给出重复的值。我也写了不同的顺序,但结果是一样的,谁能帮我解决这个问题呢 编辑–表名别名相同的查询: 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_e

我编写sql查询是为了实现不同的场景,但问题是它会给出重复的值。我也写了不同的顺序,但结果是一样的,谁能帮我解决这个问题呢


编辑–表名别名相同的查询:

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

是的,因为你在做大量的笛卡尔乘积,这些乘积的连接没有on子句,这会导致很多看起来像是“重复值”的东西,但是它们实际上只是两个表组合集的产物。

请重新格式化以使此查询可读-如果您可以说明哪些值在重复,那将更有帮助!10人?你确定你需要那么多吗?你需要为你的所有连接指定一个
ON…
子句-这在你的很多连接中都没有。另外:请使用表格别名!!这使得阅读如此庞大的声明变得简单多了!拿一张新餐巾,从头开始绘制DB架构。。这不会影响您的查询是否足以让某人了解您想要的结果。我的一个建议是从一个表开始,可能是
pi_employee
。确保从该表中获得所需内容,然后开始一次一个地添加其他表。当您开始获得重复的行时,您会注意到,然后您需要弄清楚该怎么做。要么接受将有重复项,要么决定要从最新添加的表中选择哪一行,可能是最新的,然后使用子查询为联接左侧的每一行仅获取该行。您错了。那里的每个连接都有其相应的ON子句。这不是很明显,因为有些联接看起来是这样的:
…table0联接table1联接table2 ON condition2 ON condition1…
。这是SQL Server中的一种有效语法,没有括号就显得有些晦涩。(与此相比较:
…table0 JOIN(条件2上的table1 JOIN table2)条件1上的table1…
,即您实际上正在将另一个联接的结果联接回最左边的表。)SQL server?那就向西斯解释了我的无知。甲骨文和我的唯一。
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