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 子句中。(SQLExecute[8120] at ext''pdo_odbc''odbc_stmt.c:254)

知道我在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 以确定要分组的字段以获得正确的聚合。