如何避免sql命令中的重复数据

时间:2014-05-07 01:10:24

标签: mysql sql

我尝试使用DISTINCT来避免重复数据,但没有工作。 如何避免重复数据?

表1

Employee code      Deduction Voucher no    Dec_Amount

001                  999                    50
001                  888                    20
002                  777                    100

表2

Employee code     Payslip Voucher No    Pay_Amount
001                      111             100
002                      222             200

输出应为:

Employee code     Deduction Voucher no    Dec_Amount     Payslip Voucher No   Pay_Amount

001                  999                    50            111                   100
001                  888                    20            
002                  777                    100           222                   200

但我得到了这样的表格。

Employee code     Deduction Voucher no    Dec_Amount     Payslip Voucher No   Pay_Amount

001                  999                    50            111                   100
001                  888                    20            111                   100
002                  777                    100           222                   200

3 个答案:

答案 0 :(得分:0)

仅使用SQL查询无法获得这些结果。在我看来,你需要它以这种格式显示在table / excel电子表格中。如果是这种情况,你将不得不处理"隐藏"具有一些其他代码的特定条目。原因是您要隐藏的条目与001员工正确关联。

答案 1 :(得分:0)

虽然我同意这可能在您的前端代码中更有意义,但可以在SQL中执行。使用变量,您将获得类似于SQL Server的ROW_NUMBER函数的函数,然后只加入每个员工代码的第一行。

查看sqlfiddle - http://sqlfiddle.com/#!2/47302/11

SELECT t1.`Employee code`,`Deduction Voucher no`,`Dec_Amount`,
    COALESCE(`Payslip Voucher No`,'') as `Payslip Voucher No`, 
    COALESCE(CAST(`Pay_Amount` as char(10)),'') as `Pay_Amount`
FROM Table2 t2
RIGHT JOIN
(

       SELECT  @row_num := IF(@prev_value=`Employee code`,@row_num+1,1) AS RowNumber
             ,`Employee code`,`Deduction Voucher no`,`Dec_Amount`
             ,@prev_value := `Employee code` 
       FROM Table1,
             (SELECT @row_num := 1) x,
             (SELECT @prev_value := '') y
       ORDER BY `Employee code`
  ) t1
  ON t1.`Employee code`=t2.`Employee code` AND t1.RowNumber=1

答案 2 :(得分:0)

为了扩展@d.lanza38的答案,DB没有办法告诉table1中的哪一行应该从table2获取数据。请记住,数据库中的数据没有顺序,因此没有“雇员代码001的第一行”的固有概念。

标准(内部)联接将如您所示 - 将它们放在两者上。这实际上是正确的 - 您的表结构表示对于表2中的每个工资单,可以有很多扣除。因此,如果您需要来自两个表的数据,则扣除必须附加匹配的工资单数据。

您无法使用DISTINCT神奇地修复数据 - 您需要了解数据结构并正确关联它们。

要获取示例中的内容(可能是错误的),请尝试以下SQL:

select 
  a.Employee_code,
  Deduction_Voucher_no,
  Dec_Amount,
  Payslip_Voucher_No,
  Pay_Amount
from 
  table1 as a
inner join table2 as b on a.employee_code = b.employee_code
where Deduction_Voucher_no = (
  select max(Deduction_Voucher_no)
  from table1 as c
  where a.Employee_code = c.Employee_code)
UNION
select 
  a2.Employee_code,
  Deduction_Voucher_no,
  Dec_Amount,
  null as Payslip_Voucher_No,
  null as Pay_Amount
from 
  table1 as a2
inner join table2 as b2 on a2.employee_code = b2.employee_code
where Deduction_Voucher_no <> (
  select max(Deduction_Voucher_no)
  from table1 as c2
  where a2.Employee_code = c2.Employee_code)
order by 1,2 desc

注意:未经测试,因为我没有您的数据库,甚至不知道您使用的是哪个数据库引擎。如果它抱怨选择空值,请使用0''替换,具体取决于数据类型。

更新改进了SQL并提供了一个小提琴:http://sqlfiddle.com/#!2/e7fc2/2