繁体   English   中英

SQL左联接来自表和列的混合,并抛出“ SQLSTATE [42000]:语法错误或访问冲突8120”错误

[英]SQL left join from a mix of tables and columns throwing a “SQLSTATE[42000]: Syntax error or access violation 8120” error

这是我的查询:

$sql = "SELECT sum(CommitmentItemInvoices.Amount) AS PendTotal, CommitmentItemInvoices.Amount AS Amount_Pending , CommitmentItems.*, CommitmentItemInvoices.*
                    FROM CommitmentItemInvoices 
                    LEFT JOIN CommitmentItems on CommitmentItems.commitmentItemId = CommitmentItemInvoices.commitmentItemId
                    WHERE (CommitmentItemInvoices.Status='new' AND CommitmentItemInvoices.commitmentItemId = :commitId)";
                try{
                    //prepare statement
                    $stmt = $con->prepare ($sql);

                    //bind values to :username
                    $stmt->bindValue("commitId", $commitId, PDO::PARAM_STR);


                    $stmt->execute();
                }catch(PDOException $e){
                    echo "Error: ".$e->getMessage();
                }

我收到以下错误:

错误:SQLSTATE [42000]:语法错误或访问冲突:8120 [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]列“ CommitmentItemInvoices.Amount”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句。 (位于ext \\ pdo_odbc \\ odbc_stmt.c:254的SQLExecute [8120])

关于我在SQL查询中做错的任何想法吗?

您需要一个GROUP BY语句以允许聚合工作:

SELECT sum(cii.Amount) AS PendTotal
FROM CommitmentItemInvoices cii
LEFT JOIN CommitmentItems ci on 
         ci.commitmentItemId = cii.commitmentItemId
WHERE (cii.Status='new' 
  AND cii.commitmentItemId = :commitId)

@xQbert提出了一个很好的建议。 拉出所有字段,您将看到该查询有效。 然后将它们一个接一个地添加到查询的选择和分组中。 您将看到聚合的工作方式。

查询中的*不起作用,因为sql引擎需要知道如何汇总您的总和。 您可以按多个字段进行汇总,但是每个字段都需要在分组依据的选择AND中指定。

添加更多字段进行分组时,您可能会得到不同的结果。

阅读GROUP BY,以确定要分组以获取正确聚合的字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM