完全外部加入不在MySql中工作

时间:2013-09-08 07:12:21

标签: mysql sql outer-join

我想知道MySQL中 Full Outer Join 的替代方案。我知道这可以通过工会来完成,但它不起作用,因为我的要求有点复杂,我希望如此。我有两个表master(branch_id,purchase_mindate,purchase_billvalue)和transfer(branch_id,tra_gtr_date,tra_travalue),其中两个id字段几乎相同。现在我需要通过连接具有条件的两个表来获取值 id,sum(billvalue),sum(travalue)

  1. Mindate =当前日期
  2. Gtrdate =当前日期
  3. 如果master的表没有任何值,但转移表包含则必须包含transfer的值
  4. 如果master的表包含值但传输不包含,则必须显示master的值。
  5. 我尝试过工会,加入等等,但没有任何帮助我知道我在某处做错了什么,但我无法确定请帮助我。

    我使用了以下查询,

    select purchase_master.branch_id, sum(purchase_billvalue) as billvalue, sum(tra_value) as travalue 
    
    from purchase_master 
    join purchase_transfer on purchase_master.branch_id=purchase_transfer.branch_id 
    where purchase_mindate=CURDATE() and tra_gtr_date=CURDATE() 
    group by branch_id
    

    只有当两个表包含当前日期但我没有得到任何值(如果一个表有,而其他表没有)时,我得到值

    我附上了桌子的屏幕截图。

    1. 主表Transfer Table Master Table

    2. 转移表

    3. 我尝试了以下查询,但结果为空,

      select pm.branch_id,pm.purchase_billvalue, pt.tra_value from purchase_master as pm
      left outer join purchase_transfer as pt on pm.branch_id=pt.branch_id
      where pm.purchase_mindate=CURDATE() and pt.tra_gtr_date=CURDATE()
      union
      select pm.branch_id,pm.purchase_billvalue, pt.tra_value from purchase_master as pm
      right outer join purchase_transfer as pt on pm.branch_id = pt.branch_id
      where pm.purchase_mindate=CURDATE() and pt.tra_gtr_date=CURDATE()
      

      我需要结果作为sum(billvalue)sum(travalue)group by branch_id,

      1. 如果两个表包含当前日期数据
      2. 如果任何人包含当前日期数据

2 个答案:

答案 0 :(得分:3)

由于每个表格每branch_id个符合一行,因此您需要先在每个表格中GROUP BY branch_id - 然后使用FULL JOIN模拟UNION ALL,还有一个GROUP BY或两个子查询,一个包含LEFT,另一个包含RIGHT外连接。

第一个(GROUP BY分开,然后UNION ALLGROUP BY)方式:

SELECT branch_id, 
       SUM(purchase_billvalue) AS purchase_billvalue, 
       SUM(tra_value) AS tra_value
FROM
  ( SELECT branch_id, 
           SUM(purchase_billvalue) AS purchase_billvalue,
           NULL AS tra_value
    FROM purchase_master
    WHERE purchase_mindate = CURDATE()
    GROUP BY branch_id
  UNION ALL
    SELECT branch_id, 
           NULL, 
           SUM(tra_value)
    FROM purchase_transfer  
    WHERE tra_gtr_date = CURDATE()
    GROUP BY branch_id
) AS u
GROUP BY branch_id ;

@peterm's answer 中提供了第三种方法 - 这可能是最有效的方法(但要测试!)。首先执行UNION(不是UNION ALL)从两个表中查找所有不同的branch_id,然后将2 LEFT个连接到已执行{{1分开。

答案 1 :(得分:2)

你可以做这样的事情

SELECT i.branch_id, 
       m.purchase_billvalue billvalue, 
       t.tra_travalue       travalue
  FROM
(
    SELECT branch_id
      FROM master
     WHERE purchase_mindate = CURDATE()
     UNION
    SELECT branch_id
      FROM transfer  
     WHERE tra_gtr_date = CURDATE()
) i LEFT JOIN 
(
  SELECT branch_id, SUM(purchase_billvalue) purchase_billvalue
    FROM master 
   WHERE purchase_mindate = CURDATE()
   GROUP BY branch_id
) m
    ON i.branch_id = m.branch_id LEFT JOIN 
(
  SELECT branch_id, SUM(tra_travalue) tra_travalue
    FROM transfer  
   WHERE tra_gtr_date = CURDATE()
   GROUP BY branch_id
) t
    ON i.branch_id = t.branch_id

示例输出(基于您的屏幕截图并假设两个表中所有显示行的日期值相等):

| BRANCH_ID | BILLVALUE | TRAVALUE |
|-----------|-----------|----------|
|         2 |  72580.61 |   119947 |
|         3 |    (null) |     9940 |

这是 SQLFiddle 演示