[英]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.