Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何避免sql命令中的重复数据_Mysql_Sql - Fatal编程技术网

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

Mysql 如何避免sql命令中的重复数据,mysql,sql,Mysql,Sql,我尝试使用DISTINCT来避免数据重复,但并没有工作。 如何避免重复数据 表1 表2 输出应为: Employee code Deduction Voucher no Dec_Amount Payslip Voucher No Pay_Amount 001 999 50 111 100 001 888

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

表1

表2

输出应为:

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

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

虽然我同意在前端代码中这样做可能更有意义,但在SQL中这样做是可能的。使用一个变量,可以得到一个类似于SQL Server的ROW_NUMBER函数的函数,然后只在每个员工代码的第一行进行联接

看小提琴-


为了扩展@d.lanza38的答案,DB无法判断表1中的哪一行应该从表2中获取数据。请记住,数据库中的数据没有顺序,因此没有员工代码为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并提供了一个提示:

您是否查看了组By我很难读取您的表架构信息很难知道列名的开始/结束位置。你能重新格式化吗?此外,请提供导致复制的SQL。
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
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
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