【问题标题】:LEFT JOIN 2 columns within the same table if the same value is available in both column如果两列中都有相同的值,则在同一个表中 LEFT JOIN 2 列
【发布时间】:2019-12-24 08:37:30
【问题描述】:

我有这张桌子。我想要实现的是 LEFT JOIN 仅在同一列中存在 2 个值时才有效。

例如,LEFT JOIN 仅适用于 EA-AC-A060047,因为它可用于贷记和借记列。以此类推。

这就是我想要实现的目标。

这是我目前得到的,没有运气。

SELECT 
    t1.referenceno, t2.credit, t3.debit 
FROM
    (SELECT 
         referenceno, credit, debit, employeeidno 
     FROM
         earningsamendment 
     WHERE 
         employeeidno = 'D0080000010') AS t1
LEFT JOIN
    (SELECT 
         referenceno, credit, debit, employeeidno 
     FROM
         earningsamendment 
     WHERE
         employeeidno = 'D0080000010') AS t2 ON t2.referenceno = t1.referenceno
LEFT JOIN
    (SELECT 
         referenceno, credit, debit, employeeidno 
     FROM
         earningsamendment 
     WHERE
         employeeidno = 'D0080000010') AS t3 ON t3.referenceno = t1.referenceno
WHERE
    t2.referenceno = t1.referenceno 
    AND t3.referenceno = t1.referenceno
ORDER BY  
    t1.referenceno

【问题讨论】:

  • 最后一个信用值可用。但您是说 - * 可用于贷记和借记列*。

标签: sql sql-server join sql-server-2012 left-join


【解决方案1】:

如果您希望左连接仅在存在两个值时起作用 - 即如果不是这种情况,您希望它不返回任何内容,这听起来像是内连接。因此,从不同的参考编号/员工编号开始。假设是贷方不超过一笔,借方不超过一笔……

选择 * 来自

( 选择不同的 参考编号, 员工编号 从 收入修正)作为 t1

内连接

( 选择参考编号,雇员编号,

  (SELECT credit from earningsamendment e3
     where e3.employeeidno = e2.employeeidno and
           e3.referenceno = e2.referenceno and
           isnull(e3.credit ,0) <> 0  ) as credit,


  (SELECT debit from earningsamendment e3
     where e3.employeeidno = e2.employeeidno and
           e3.referenceno = e2.referenceno and
           isnull(e3.debit ,0) <> 0  ) as debit
  FROM earningsamendment e2
  GROUP BY referenceno,employeeidno

) 作为 t2

开启 t2.referenceno=t1.referenceno 和 t2.employeeidno = t1.employeeidno

当 t2.debit 为 NULL 且 t2.credit 不为 NULL 时

【讨论】:

  • 这是另一种方法。我会研究这个。谢谢。
【解决方案2】:

如果贷方和借方列各只有 1 行,您可以使用 group by 和 'max` 轻松实现此目的。

   select referenceno, max(credit) as Credit, max(debit) as Debit , employeeidno 
   from earningsamendment group by referenceno, employeeidno 

上面的查询给出了上面问题中预期的结果。

现在,如果您只想在 creditdebit 都存在的情况下获取记录。

   ; with cte as (
   select referenceno, max(credit) as Credit, max(debit) as Debit , employeeidno 
   from earningsamendment group by referenceno, employeeidno 
   )
   select * from cte where Credit>0 and Debit>0

【讨论】:

  • 这将跳过带有 referenceno 且在借方/贷方中没有配对的值。前任。 EA-HR-A061393 不会显示在查询中。
  • 不,这将给出您想要的确切结果。 @pjustindaryll:至少在标记任何评论之前测试一下。如果在任何情况下这不起作用,请发布带有输入和预期输出的场景。
  • 抱歉,我之前编辑了我的数据库,这就是我得到不同结果的原因。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
相关资源
最近更新 更多