【问题标题】:Inner joins returning duplicate records内部联接返回重复记录
【发布时间】:2020-01-07 11:38:30
【问题描述】:

我编写这个查询是为了从 3 个不同的表中检索数据。

这里[我选择的所有列都来自第一个和第二个表],根据我的实际需要检索数据:

SELECT DISTINCT SD.salary_component,SS.posting_date,SS.payroll_entry,
                        SD.parentfield,SD.amount,SS.employee,SS.name
FROM`tabSalary Detail` SD
INNER JOIN  `tabSalary Slip` SS 
    ON SS.name=SD.parent
INNER JOIN `tabGL Entry` GL
    ON GL.against_voucher=SS.payroll_entry
WHERE SS.employee='EMP0110' AND 
                     SS.posting_date='2020-03-11' AND 
                     SD.parentfield != 'indebtedness' AND
                     SS.payroll_entry='HR-PRUN-2019-01027';

想要的和查询结果是

AAAA    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000 EMP0110 Sal Slip-EMP0110-1911-04

BBBB    2020-03-11  HR-PRUN-2019-01027  earnings    300.000000 EMP0110  Sal Slip-EMP0110-1911-04

CCCC    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000 EMP0110  Sal Slip-EMP0110-1911-04

DDDD    2020-03-11  HR-PRUN-2019-01027  earnings    3600.000000 EMP0110 Sal Slip-EMP0110-1911-04

=======

但是,当我在第三个表中选择两列时,出现问题并且数据重复:

SELECT DISTINCT SD.salary_component,SS.posting_date,SS.payroll_entry,
                        SD.parentfield,SD.amount,SS.employee,SS.name
                        GL.credit,GL.debit
FROM`tabSalary Detail` SD
INNER JOIN  `tabSalary Slip` SS 
    ON SS.name=SD.parent
INNER JOIN `tabGL Entry` GL
    ON GL.against_voucher=SS.payroll_entry
WHERE SS.employee='EMP0110' AND 
                     SS.posting_date='2020-03-11' AND 
                     SD.parentfield != 'indebtedness' AND
                     SS.payroll_entry='HR-PRUN-2019-01027';

第二个查询结果是54行重复

AAAA    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    300.000000
AAAA    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    300.000000  0.000000

AAAA    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    500.000000
AAAA    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    500.000000  0.000000

AAAA    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    3600.000000
AAAA    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    3600.000000 0.000000

AAAA    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    445.890000
AAAA    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    445.890000  0.000000

AAAA    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    336.990000
AAAA    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    336.990000  0.000000

AAAA    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    95.000000
AAAA    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    95.000000   0.000000

AAAA    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    1150.000000
AAAA    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    1150.000000 0.000000
===================================================================================================================================
BBBB    2020-03-11  HR-PRUN-2019-01027  earnings    300.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    300.000000
BBBB    2020-03-11  HR-PRUN-2019-01027  earnings    300.000000  EMP0110 Sal Slip-EMP0110-1911-04    300.000000  0.000000

BBBB    2020-03-11  HR-PRUN-2019-01027  earnings    300.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    500.000000
BBBB    2020-03-11  HR-PRUN-2019-01027  earnings    300.000000  EMP0110 Sal Slip-EMP0110-1911-04    500.000000  0.000000

BBBB    2020-03-11  HR-PRUN-2019-01027  earnings    300.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    3600.000000
BBBB    2020-03-11  HR-PRUN-2019-01027  earnings    300.000000  EMP0110 Sal Slip-EMP0110-1911-04    3600.000000 0.000000

BBBB    2020-03-11  HR-PRUN-2019-01027  earnings    300.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    445.890000
BBBB    2020-03-11  HR-PRUN-2019-01027  earnings    300.000000  EMP0110 Sal Slip-EMP0110-1911-04    445.890000  0.000000

BBBB    2020-03-11  HR-PRUN-2019-01027  earnings    300.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    336.990000
BBBB    2020-03-11  HR-PRUN-2019-01027  earnings    300.000000  EMP0110 Sal Slip-EMP0110-1911-04    336.990000  0.000000

BBBB    2020-03-11  HR-PRUN-2019-01027  earnings    300.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    95.000000
BBBB    2020-03-11  HR-PRUN-2019-01027  earnings    300.000000  EMP0110 Sal Slip-EMP0110-1911-04    95.000000   0.000000

BBBB    2020-03-11  HR-PRUN-2019-01027  earnings    300.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    1150.000000
BBBB    2020-03-11  HR-PRUN-2019-01027  earnings    300.000000  EMP0110 Sal Slip-EMP0110-1911-04    1150.000000 0.000000
===================================================================================================================================
CCCC    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    300.000000
CCCC    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    300.000000  0.000000

CCCC    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    500.000000
CCCC    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    500.000000  0.000000

CCCC    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    3600.000000
CCCC    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    3600.000000 0.000000

CCCC    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    445.890000
CCCC    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    445.890000  0.000000

CCCC    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    336.990000
CCCC    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    336.990000  0.000000

CCCC    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    95.000000
CCCC    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    95.000000   0.000000

CCCC    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    0.000000    1150.000000
CCCC    2020-03-11  HR-PRUN-2019-01027  earnings    500.000000  EMP0110 Sal Slip-EMP0110-1911-04    1150.000000 0.000000
===================================================================================================================================
DDDD    2020-03-11  HR-PRUN-2019-01027  earnings    3600.000000 EMP0110 Sal Slip-EMP0110-1911-04    0.000000    300.000000
DDDD    2020-03-11  HR-PRUN-2019-01027  earnings    3600.000000 EMP0110 Sal Slip-EMP0110-1911-04    300.000000  0.000000

DDDD    2020-03-11  HR-PRUN-2019-01027  earnings    3600.000000 EMP0110 Sal Slip-EMP0110-1911-04    0.000000    500.000000
DDDD    2020-03-11  HR-PRUN-2019-01027  earnings    3600.000000 EMP0110 Sal Slip-EMP0110-1911-04    500.000000  0.000000

DDDD    2020-03-11  HR-PRUN-2019-01027  earnings    3600.000000 EMP0110 Sal Slip-EMP0110-1911-04    0.000000    3600.000000
DDDD    2020-03-11  HR-PRUN-2019-01027  earnings    3600.000000 EMP0110 Sal Slip-EMP0110-1911-04    3600.000000 0.000000

DDDD    2020-03-11  HR-PRUN-2019-01027  earnings    3600.000000 EMP0110 Sal Slip-EMP0110-1911-04    0.000000    445.890000
DDDD    2020-03-11  HR-PRUN-2019-01027  earnings    3600.000000 EMP0110 Sal Slip-EMP0110-1911-04    445.890000  0.000000

DDDD    2020-03-11  HR-PRUN-2019-01027  earnings    3600.000000 EMP0110 Sal Slip-EMP0110-1911-04    0.000000    336.990000
DDDD    2020-03-11  HR-PRUN-2019-01027  earnings    3600.000000 EMP0110 Sal Slip-EMP0110-1911-04    336.990000  0.000000

DDDD    2020-03-11  HR-PRUN-2019-01027  earnings    3600.000000 EMP0110 Sal Slip-EMP0110-1911-04    0.000000    95.000000
DDDD    2020-03-11  HR-PRUN-2019-01027  earnings    3600.000000 EMP0110 Sal Slip-EMP0110-1911-04    95.000000   0.000000

DDDD    2020-03-11  HR-PRUN-2019-01027  earnings    3600.000000 EMP0110 Sal Slip-EMP0110-1911-04    0.000000    1150.000000
DDDD    2020-03-11  HR-PRUN-2019-01027  earnings    3600.000000 EMP0110 Sal Slip-EMP0110-1911-04    1150.000000 0.000000

出了什么问题,我应该搜索哪些主题来获得这个想法? 最后,什么是最好的解决方案?

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助。
  • 使用第一个查询作为一个表并与tabGL Entry GL 连接以解决问题
  • 我不懂你的表。为什么salary_detail 和salary_slip 表是通过name 和一个名为parent 的列连接的?为什么不通过一些工资ID?请向我们提供有关您的桌子的详细信息。它们代表什么?他们独特的钥匙是什么?它们是如何通过外键关联的。
  • 关于您的第一个查询:DISTINCT 通常表示查询写得不好。你怎么会首先得到重复的行?你不能马上避开它们吗?您的连接是否不完整,从而产生它们?在您的第二个查询中,您可能需要一些聚合。不知道。请向我们展示示例数据,以演示您获得重复结果行的情况。
  • @GordonLinoff 我已经编辑了帖子

标签: mysql sql inner-join distinct distinct-on


【解决方案1】:

我强烈怀疑你想要GROUP BY

SELECT SD.salary_component, SS.posting_date, SS.payroll_entry,                       
       SD.parentfield, SD.amount, SS.employee, SS.name,
       SUM(GL.credit), SUM(GL.debit)
FROM `tabSalary Detail` SD INNER JOIN
     `tabSalary Slip` SS 
      ON SS.name = SD.parent INNER JOIN
      `tabGL Entry` GL
      ON GL.against_voucher=SS.payroll_entry
WHERE SS.employee = 'EMP0110' AND 
      SS.posting_date = '2020-03-11' AND 
      SD.parentfield <> 'indebtedness' AND
      SS.payroll_entry = 'HR-PRUN-2019-01027'
GROUP BY SD.salary_component, SS.posting_date, SS.payroll_entry,                       
         SD.parentfield, SD.amount, SS.employee, SS.name;

【讨论】:

    【解决方案2】:
    SELECT DISTINCT SD.salary_component,SS.posting_date,SS.payroll_entry,
                        SD.parentfield,SD.amount,SS.employee,SS.name
                        SUM(GL.credit) AS credit,SUM(GL.debit) AS debit
       FROM`tabSalary Detail` SD
    INNER JOIN  `tabSalary Slip` SS 
       ON SS.name=SD.parent
    INNER JOIN `tabGL Entry` GL
       ON GL.against_voucher=SS.payroll_entry
    WHERE SS.employee='EMP0110' AND 
                     SS.posting_date='2020-03-11' AND 
                     SD.parentfield != 'indebtedness' AND
                     SS.payroll_entry='HR-PRUN-2019-01027'
    GROUP BY SD.salary_component, SS.posting_date, SS.payroll_entry,                       
         SD.parentfield, SD.amount, SS.employee, SS.name;
    

    【讨论】:

      【解决方案3】:

      我同意即使是显示重复的几行示例数据也会非常有帮助。

      通常发生的事情是连接到第三个表 (ON GL.against_voucher=SS.payroll_entry) 再加上没有任何“GL”。 WHERE 子句中的标准不够具体,无法消除重复的创建。

      因此,即使行不同,使用 DISTINCT 和/或 GROUP BY 仍会在某些字段中产生重复项。

      如果您提供一些重复的 GOOD 示例,那么有效的语法将更容易回答。

      【讨论】:

      • 我已经添加了
      猜你喜欢
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      相关资源
      最近更新 更多