【发布时间】:2010-02-26 11:37:06
【问题描述】:
这是我的两个表的内部连接的选择语句,
if not exists(select EmpId from SalaryDetails
where EmpId in (select Emp_Id
from Employee where Desig_Id=@CategoryId))
begin
// some statements here
end
else
begin
SELECT e.Emp_Id, e.Identity_No, e.Emp_Name,
case WHEN e.SalaryBasis=1 THEN 'Weekly'
ELSE 'Monthly' end as SalaryBasis,e.FixedSalary,
(SELECT TOP 1 RemainingAdvance
FROM SalaryDetails
ORDER BY CreatedDate DESC) as Advance
FROM Employee as e inner join Designation as d on e.Desig_Id=d.Desig_Id
INNER JOIN SalaryDetails as S on e.Emp_Id=S.EmpId
End
我的结果窗格,
alt text http://img220.imageshack.us/img220/7774/resultpane.jpg
还有我的 SalaryDetails 表,
alt text http://img28.imageshack.us/img28/770/salarydettable.jpg
编辑: 我的输出必须是,
16 CR14 Natarajan Weekly 150.00 354.00
17 cr12333 盘点周刊 122.00 0.00
【问题讨论】:
-
如果您向我们提供有关您的输出有什么问题的线索,这可能会有所帮助。我想不通,也不愿意。
-
@Lieven,正要发表同样的评论——我猜测他的 Advance 总是得到 354,而他在 SalaryDetails 中的值不同——我可能会离题,不过。
-
你是对的,但这与内部连接无关。
-
所以 if not exists 语句与它无关。显然,这两个用户都存在,因为您要让他们重新出现在结果中 - 问题应该是为什么您会得到重复的记录,当然?在这种情况下,我会对您说,您的 SalaryDetails 中有员工 16 和 17 的多条记录,但您没有过滤或分组它们以获取每个员工的一条记录,因此 SQL 会为您提供所有记录。您需要过滤或分组。
-
嗯,看你的数据,前面加上DISTINCT,实现Andy给出的解决方案。
标签: sql-server-2005 inner-join