首页 > 解决方案 > 从 2 个不同的表中选择

问题描述

sql版本:'5.7.34'

如下:

第一个表名:Invoice

表格发票说明

列名 类型名称 额外的
发票号码 整数(11) 人工智能PK
项目编号 字符(255)
描述 字符(255)
数量 十进制(9,2)

项目表说明:

列名 类型名称 额外的
ID 整数(11) 人工智能PK
项目编号 varchar(255) PK
Item_Desc varchar(255)
开始平衡 十进制(9,2)

发票表有这些字段:

ItemNumber ,InvoiceNumber ,  Item_Desc , Qty

项目表有这些字段:

ItemNumber , Item_Desc, Start_Balance

Invoice 的 PrimaryKey 是 invoicenumber

Items 表的 PrimaryKey 是 Item_Number

所以基本上我想要做的是通过从项目表中获取 Start_balance 并根据项目编号从发票表中每个项目订单的总数量中减去它来获取剩余数量。

Invoice 表可以有多个带有项目编号的记录,而 items 表的每一行只有唯一的项目编号。

如何使 select 语句加入两个表以通过加入两个表来获取每个 itemNumber 的剩余数量?

我试过这个:

    (SELECT 
        `items`.`Start_Balance_Qty` - SUM(`invoice`.`QTY`)) AS `currentitembalance`,
        `details`.`item_number` AS `itemnumber`,
        `details`.`DESCRIPTION` AS `itemdesc`,
        `items`.`item_number` AS `item_number`
    FROM
    (`items`
    JOIN `invoice`)
    WHERE

       (`invoice`.`item_number` = `items`.`item_number`)
       GROUP BY `items`.`item_number`)

它工作正常,但问题是它只获取与两个表中的 itemNumber 匹配的发票表上的记录,我需要显示项目表中的所有字段以显示当前余额,换句话说,我希望结果显示剩余尽管发票表中有多少记录匹配,但项目表的数量。

标签: mysqlsqlsubquery

解决方案


用于LEFT JOIN确保在结果集中返回前导表中的所有行,即使它不匹配连接表中的任何记录,也可以在ON子句而不是WHERE子句中附加连接条件。当SUM值时,转换NULL0

SELECT 
a.item_number AS itemnumber, 
MAX(a.description) AS itemdesc, 
MAX(a.start_balance_qty) - SUM(IFNULL(b.qty, 0))
FROM items a
LEFT JOIN invoice b ON a.item_number = b.item_number
GROUP BY a.item_number
;

推荐阅读