【问题标题】:How to remove repeated data from the result of joins of 2 different tables?如何从 2 个不同表的连接结果中删除重复数据?
【发布时间】:2014-02-11 12:09:45
【问题描述】:

我的数据库中有 3 个表,分别是:

1.表 1 (po)

po_id   other_col_data
  1       other col data
  2       other col data
  3       other col data
  4       other col data
  5       other col data
  6       other col data

2。 table2 (po_items)

      po_id   |poitems  |amount          
      ========+=======+==========      
      1       |aaaa   |200             
      1       |bbbbb  |150             
      2       |ccccc  |50              
      2       |ddddd  |250  
      3       |eeeee  |325
      3       |fffff  |520 
      3       |ggggg  |120

3.表 3 (inv_items)

      po_id   |invitems|amount          
      ========+=======+==========      
      1       |aaaa   |200             
      1       |bbbbb  |150             
      1       |ccccc  |50              
      2       |ddddd  |250  
      3       |eeeee  |325
      3       |fffff  |520 
      3       |ggggg  |120
      1       |ccccc  |50              
      2       |ddddd  |250  
      3       |eeeee  |325
      1       |kkkkk  |50              
      2       |ddddd  |250  
      3       |eeeee  |325

我想得到以下格式:

结果

  ID   ITEM   PO-Amount INV-Amount
    ====+======+==========+==========  
    1    aaaaa  200       200
    1    aaaaa  150       150 
    1    ccccc  00        50
    1    kkkkk  00        50

【问题讨论】:

  • ...和 ​​(我假设) 你不知道如何编写 SQL?对吗?
  • 您是否尝试过任何查询来解决此问题?
  • SELECT po.id, poi.item_description, poi.amount AS POI_AMOUNT, inv.amount AS INV_AMOUNT FROM purchase_orders AS po INNER JOIN purchase_order_items AS poi ON po.id = poi.purchase_order_id INNER JOIN invoice_items AS inv ON po.id = inv.purchase_order_id WHERE inv.purchase_order_id = poi.purchase_order_id
  • 但是此查询将返回 po_items 表中的所有项目...问题是,如果在这种情况下 inv_amount 列的发票表中不存在该项目,请重复之前的金额那个特定的项目......

标签: mysql sql join subquery database-administration


【解决方案1】:

试试这个查询:

SELECT DISTINCT
po_items.po_id AS ID,
if(po_items.poitems = 'NULL' or po_items.poitems = '', inv_items.invitems, po_items.poitems) AS ITEM,
ifnull(po_items.amount,0) AS PO-AMOUNT,
ifnull(inv_items.amount,0) AS INV-AMOUNT
FROM po_items
LEFT OUTER JOIN inv_items ON po_items.po_id = inv_items.po_id
UNION
SELECT DISTINCT
po_items.po_id AS ID,
if(po_items.poitems = 'NULL' or po_items.poitems = '', inv_items.invitems, po_items.poitems) AS ITEM,
ifnull(po_items.amount,0) AS PO-AMOUNT,
ifnull(inv_items.amount,0) AS INV-AMOUNT
FROM po_items
RIGHT OUTER JOIN inv_items ON po_items.po_id = inv_items.po_id
WHERE inv.purchase_order_id = poi.purchase_order_id;

【讨论】:

  • SELECT po.id, poi.item_description, poi.amount AS POI_AMOUNT, inv.amount AS INV_AMOUNT FROM purchase_orders AS po INNER JOIN purchase_order_items AS poi ON po.id = poi.purchase_order_id INNER JOIN invoice_items AS inv ON po.id = inv.purchase_order_id WHERE inv.purchase_order_id = poi.purchase_order_id
  • 我也使用了同样的查询,它将返回 po 表中的所有项目,而不是两个表中的所有项目......而且我也无法忽略 INV_Amount 的重复......
  • 所以第一件事是我希望从两个表中获取所有唯一项目,如果两个表中都有可用的金额,则显示,如果其中一个表中不可用,则显示 0 或 NULL或空白,但我不想在那里重复以前的数量...它将帮助您理解我的问题...
  • 根据我对您的要求的理解,请尝试我在回答中上面编辑的查询。
  • 我试过了......但它给出的结果与以前相同......结果中没有发现任何变化。
猜你喜欢
  • 2011-08-11
  • 2013-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 2020-06-20
  • 1970-01-01
相关资源
最近更新 更多