不需要的重复值SELECT JOIN

时间:2015-02-03 21:13:28

标签: sql vb.net ms-access

我在2个表中有2条记录,其中 ID 相同,从DB加载时我得到重复值

所以这是我的第一张表:

 |--ID--|--Gross Salary--|--Day--|
     1      100             1
     1      200             2

表2:

|--ID--|--Net Salary--|
     1      100          
     1      200       

加载时的结果:

  |--ID--|--Gross Salary--|--Net Salary--|--Day--|
        1      100            100           1
        1      100            200           1
        1      200            100           2
        1      200            200           2

我需要展示的内容:

|--ID--|--Gross Salary--|--Net Salary--|--Day--|
     1      100             100            1
     1      200             200            2

我的代码:

  Dim loadq As String = "SELECT DriverEmpEarns.LastName, DriverEmpEarns.FirstName, DriverEmpEarns.Mi, DriverEmpEarns.[Position], DriverEmpEarns.[No of Trips 6W], DriverEmpEarns.[Total 6w], DriverEmpEarns.[No of Trips 4W], DriverEmpEarns.[Total 4w], DriverEmpEarns.[SHR], DriverEmpEarns.[PR], DriverEmpEarns.[Additional Incentives], DriverEmpEarns.[SpecialAllowance], DriverEmpEarns.GrossSalary, " & _
                "DriverEmpDed.WHTax, DriverEmpDed.PhilHealth, DriverEmpDed.SSS, DriverEmpDed.Vale, DriverEmpDed.Advances, DriverEmpDed.Damages, DriverEmpDed.Pondo, DriverEmpDed.StoreCanteen, DriverEmpDed.Others, DriverEmpDed.NetSalary  " & _
                "FROM (DriverEmpDed LEFT JOIN DriverEmpEarns ON DriverEmpEarns.EmpPID = DriverEmpDed.EmpPID) " & _
                "WHERE [Pday1] >= # " & MetroDateTime1.Value.ToShortDateString & "# AND [Pday2] <= #" & MetroDateTime2.Value.ToShortDateString & "# AND DriverEmpEarns.EmpPID = DriverEmpDed.EmpPID"

2 个答案:

答案 0 :(得分:1)

你的table2还需要有一个day列,然后你将把它包含在你的join子句中。

答案 1 :(得分:0)

它们不是重复的。这是SQL如何工作。您根据EmployeeId要求表加入。由于两个表中存在两次相同的ID,因此获得2x2记录(4)。从其中一个表中删除1条记录,您只获得2条记录。您需要删除第二条记录,设计一条规则,当相同的employeeID存在多次时,该规则控制净工资和工资总额的关系,或者重新设计数据,以便不需要加入。

只需几件事:

SELECT DriverEmpEarns.LastName, 
       DriverEmpEarns.FirstName, 
       DriverEmpEarns.Mi, 
       DriverEmpEarns.[Position], 
       DriverEmpEarns.[No of Trips 6W], 
       DriverEmpEarns.[Total 6w], 
       DriverEmpEarns.[No of Trips 4W], 
       DriverEmpEarns.[Total 4w], 
       DriverEmpEarns.[SHR], 
       DriverEmpEarns.[PR], 
       DriverEmpEarns.[Additional Incentives], 
       DriverEmpEarns.[SpecialAllowance], 
       DriverEmpEarns.GrossSalary,
       DriverEmpDed.WHTax, 
       DriverEmpDed.PhilHealth, 
       DriverEmpDed.SSS, 
       DriverEmpDed.Vale, 
       DriverEmpDed.Advances, 
       DriverEmpDed.Damages, 
       DriverEmpDed.Pondo, 
       DriverEmpDed.StoreCanteen, 
       DriverEmpDed.Others, 
       DriverEmpDed.NetSalary 
       FROM DriverEmpDed 
       LEFT JOIN DriverEmpEarns 
         ON DriverEmpEarns.EmpPID = DriverEmpDed.EmpPID 
       WHERE [Pday1] >= # " & MetroDateTime1.Value.ToShortDateString & "# 
         AND [Pday2] <= #" & MetroDateTime2.Value.ToShortDateString & "# 
         AND DriverEmpEarns.EmpPID = DriverEmpDed.EmpPID <--Redundant
  1. 你不需要最后的&#34; AND&#34;在where子句中AND DriverEmpEarns.EmpPID = DriverEmpDed.EmpPID"应该删除
  2. 不知道表[Pday1]和[Pday2]驻留,你可能会 否定你的左连接。
  3. 您在结果中获取多条记录的原因是因为数据在每个连接的表中有2条记录匹配。 T1.record1与t1记录1&amp; 2. T1.record2与t2一致。记录1和2。因此2x2导致4条记录。您需要另一个标准来定义哪个净工资与哪个工资总额相关。如果没有这个,你就无法更好地限制数据。