Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何优化来自多个表的多个子查询?_Mysql_Sql - Fatal编程技术网

Mysql 如何优化来自多个表的多个子查询?

Mysql 如何优化来自多个表的多个子查询?,mysql,sql,Mysql,Sql,我有两个表格,例如tnx\u lc\u发票和tnx\u lc\u付款。我想从这两个表生成报告 表架构如下图所示 tnx\U信用证支付 tnx\U lc\U发票 我想生成如下图像的输出 输出 我正在尝试下面的查询及其生成类似的输出。但我想优化此查询或任何其他解决方案,以获得更快的结果 SELECT a.lc_no, a.invoiceValue, b.paymentValue, ( a.invoiceValue - b.paymentValue

我有两个表格,例如tnx\u lc\u发票tnx\u lc\u付款。我想从这两个表生成报告

表架构如下图所示

tnx\U信用证支付

tnx\U lc\U发票

我想生成如下图像的输出

输出

我正在尝试下面的查询及其生成类似的输出。但我想优化此查询或任何其他解决方案,以获得更快的结果

SELECT
    a.lc_no,
    a.invoiceValue,
    b.paymentValue,
    (
        a.invoiceValue - b.paymentValue
    ) AS shortPaymentValue
FROM
    (
        SELECT
            lc_no,
            sum(invoice_value) AS invoiceValue
        FROM
            tnx_lc_invoice
        GROUP BY
            lc_no
    ) a
INNER JOIN (
    SELECT
        lc_no,
        sum(payment_value) AS paymentValue
    FROM
        tnx_lc_payment
    GROUP BY
        lc_no
) b ON a.lc_no = b.lc_no

如果有其他简单的解决方案,请告诉我。提前谢谢。

不要使用子查询,而是在它们之间创建一个内部直接查询

    SELECT
        a.lc_no,
        sum(a.invoice_value) AS invoiceValue,
        sum(b.payment_value) AS payment_value,
        (sum(a.invoice_value) - sum(b.paymentValue)) AS shortPaymentValue
    FROM       tnx_lc_invoice a
    INNER JOIN tnx_lc_payment b      
    ON a.lc_no = b.lc_no
    GROUP BY
        a.lc_no

查询不正确,因为如果发票和付款在同一信用证号上重复,则会使行相乘

因此,有必要在内部查询中至少添加一个GROUPBY

SELECT
        a.lc_no,
        sum(a.invoice_value) AS invoiceValue,
        sum(b.payment_value) AS payment_value,
        sum(a.invoice_value) - sum(b.payment_Value) AS shortPaymentValue
    FROM  (select lc_no, sum(invoice_value) as invoice_value 
           from tnx_lc_invoice group by lc_no) a
    INNER JOIN tnx_lc_payment b      
    ON a.lc_no = b.lc_no
    GROUP BY
        a.lc_no

您使用的是SQL Server、PostgreSQL还是MySQL?它们都是不同的RDBMSsSQL Server或MySQL是okI删除了无关的数据库标记。请随意添加适合您实际使用的数据库的标记。数据通常存储在单个数据库中。在任何数据库问题中,正确识别您使用的数据库后端是获得正确答案的关键,尤其是在性能调整方面,特定于数据库的解决方案通常是最快的。什么数据库是您的后端真的很重要。您没有where子句,这些表将有多大?计算一个二百万记录表中的每一个总数将是缓慢的,不管你如何查询它。你可能想考虑在其中一个表中没有一行对应的行的可能性。@ Davide不工作。你能测试这个查询吗?它显示的是负值。是的,但是OP在子查询之外添加了内部联接,所以效果是一样的。你能发布结果吗?使用问题中公开的相同数据,我尝试使用sql FIDLE。