从 2 个不同的表中选择

Posted

技术标签:

【中文标题】从 2 个不同的表中选择【英文标题】:Selecting From 2 Different Tables 【发布时间】:2021-10-09 09:28:53 【问题描述】:

sql 版本:'5.7.34'

如下:

第一个表名:Invoice

表格发票说明

column name type name extra
invoicenumber int(11) AI PK
item_number char(255)
description char(255)
qty decimal(9,2)

物品表说明:

column name type name extra
id int(11) AI PK
item_number varchar(255) PK
Item_Desc varchar(255)
Start_Balance decimal(9,2)

发票表有这些字段:

ItemNumber ,InvoiceNumber ,  Item_Desc , Qty

Items 表有这些字段:

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 匹配的发票表上的记录,我需要显示项目表中的所有字段以显示当前余额,换句话说,我希望结果尽管在 invoice 表中匹配了多少条记录,但仍显示 items 表的剩余 qty。

【问题讨论】:

你使用的是mysql 5.6版本吗?如果您使用 group by ,则所选列必须在 group by 或聚合函数的一部分中。请添加表格描述、一些数据和您的预期结果? 好的,我会尽快添加预期结果 【参考方案1】:

使用LEFT JOIN 确保在结果集中返回前导表中的所有行,即使它不匹配连接表中的任何记录,在ON 子句而不是WHERE 子句处附加连接条件.当SUM 取值时,将NULL 转换为0

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
;

【讨论】:

那是直接回答,非常感谢

以上是关于从 2 个不同的表中选择的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQLite 中的表中选择最新的 100 个不同条目?

使用 WHERE 或 JOIN 从不同的表中选择?

SQL,如何从不同的表中选择属性?

Mysql 从不同的表中按名称选择

根据sql中的条件从不同的表中选择一个值

使用 case 语句从两个不同的表中选择数据