【问题标题】:What could be the problem with this query in PostgreSQL?PostgreSQL 中的这个查询可能有什么问题?
【发布时间】:2011-05-25 06:50:46
【问题描述】:

我在 Postgres 中有这样的查询:

select sum("ATD_AMOUNT") AS CREDIT_SUM, 0 AS DEBIT_SUM,"ATD_ACCOUNT_MST_ID","AAD_OPEN_AMOUNT","AAM_ACCOUNT_NAME", "AAM_ACCOUNT_CODE" ,"AAD_YEAR_ID" 
from db_accounts."ACC_TRANSACTION_DET" 
left outer join db_accounts."ACC_TRANSACTION_MST" ON "ATD_TRANSACTION_MST_ID"=    "ATM_TRANSACTION_MST_ID"
left outer join db_accounts."ACC_ACCOUNT_MST" ON "ATD_ACCOUNT_MST_ID"="AAM_ACCOUNT_MST_ID" 
left outer join db_accounts."ACC_ACCOUNT_DET" on "AAM_ACCOUNT_MST_ID"  = "AAD_ACCOUNT_MST_ID" and "AAD_YEAR_ID"=(select "AAY_YEAR_ID" from db_accounts."ACC_ACCOUNT_YEAR" where "AAY_IS_CURRENT_YEAR"=true)
where "ATM_TRANSACTION_DATE"<= $1 and "ATM_TRANSACTION_DATE">=(select "AAY_START_DATE" from db_accounts."ACC_ACCOUNT_YEAR" where "AAY_IS_CURRENT_YEAR"=true)
and "ATM_ON_REVERSE_PARENT_TRANSACTION_ID" is null and "ATM_IS_CANCELLED"=false
    and  "AAM_DEL_FLAG" =false
AND "ATD_CREDIT_DEBIT_TRANSACTION" = 'CREDIT'
GROUP BY "ATD_ACCOUNT_MST_ID","AAD_OPEN_AMOUNT","AAM_ACCOUNT_NAME", "AAM_ACCOUNT_CODE","AAD_YEAR_ID

这里是 db_accounts。“ACC_TRANSACTION_DET”包含大约 500 万条记录,还有 db_accounts。“ACC_TRANSACTION_MST”有 60000 条记录

现在我的问题是,当我在系统中使用相同的数据库运行此查询时,我得到了结果,但是当我在其他系统中尝试时它不起作用?

我还注意到,如果以下任何一个条件被删除,它就会显示结果

"ATM_TRANSACTION_DATE"<= $1 //field in db_accounts."ACC_TRANSACTION_MST" table

"ATM_TRANSACTION_DATE">=(select "AAY_START_DATE" from db_accounts."ACC_ACCOUNT_YEAR" where "AAY_IS_CURRENT_YEAR"=true) //field in db_accounts."ACC_TRANSACTION_MST" table

"ATD_CREDIT_DEBIT_TRANSACTION" = 'CREDIT' //field in db_accounts."ACC_TRANSACTION_DET" table

【问题讨论】:

  • 当您说“相同的数据库”时,您的意思是两台计算机都查询相同的数据库服务器,还是您将数据库内容复制到您计算机上运行的 PostgreSQL 实例?
  • 没有它的两个不同的服务器,我从另一个系统备份并在我的系统中恢复它。它在我的系统中运行良好。这可能是因为表中有很多数据吗?跨度>
  • 解释分析对查询有什么看法?有哪些索引可用?您确定需要左连接,而不能使用内连接吗?
  • 所有表都没有索引。每个表只有主键和对 DET 表的外部引用

标签: sql postgresql aggregate-functions


【解决方案1】:

我已将您的查询重新格式化为www.prettysql.net

SELECT
 sum("ATD_AMOUNT") AS CREDIT_SUM,
 0 AS DEBIT_SUM,
 "ATD_ACCOUNT_MST_ID",
 "AAD_OPEN_AMOUNT",
 "AAM_ACCOUNT_NAME",
 "AAM_ACCOUNT_CODE",
 "AAD_YEAR_ID"
FROM
 db_accounts."ACC_TRANSACTION_DET" LEFT OUTER JOIN db_accounts."ACC_TRANSACTION_MST"
 ON
   "ATD_TRANSACTION_MST_ID"=
   "ATM_TRANSACTION_MST_ID" LEFT OUTER JOIN db_accounts."ACC_ACCOUNT_MST" ON "ATD_ACCOUNT_MST_ID" = "AAM_ACCOUNT_MST_ID" LEFT OUTER JOIN db_accounts."ACC_ACCOUNT_DET" ON
    "AAM_ACCOUNT_MST_ID" = "AAD_ACCOUNT_MST_ID"
  AND
   "AAD_YEAR_ID"=
   (
    SELECT "AAY_YEAR_ID"
    FROM db_accounts."ACC_ACCOUNT_YEAR"
    WHERE "AAY_IS_CURRENT_YEAR"=true
   )
WHERE
  "ATM_TRANSACTION_DATE"<=$1
 AND
  "ATM_TRANSACTION_DATE">=
  (
   SELECT "AAY_START_DATE"
   FROM db_accounts."ACC_ACCOUNT_YEAR"
   WHERE "AAY_IS_CURRENT_YEAR"=true
  )
 AND
  "ATM_ON_REVERSE_PARENT_TRANSACTION_ID" is null
 AND
  "ATM_IS_CANCELLED"=false
 AND
  "AAM_DEL_FLAG"=false
 AND
  "ATD_CREDIT_DEBIT_TRANSACTION"='CREDIT'
GROUP BY "ATD_ACCOUNT_MST_ID","AAD_OPEN_AMOUNT","AAM_ACCOUNT_NAME","AAM_ACCOUNT_CODE","AAD_YEAR_ID

您的查询中似乎有一个 where 子句,其中包含 $1,这是 Postgresql 中用于参数传递的模式。

尝试将其替换为“2011-05-25”::date 之类的内容,看看是否有帮助。

【讨论】:

  • 感谢重新格式化.....是的,这部分代码取自传递参数的函数。我发现问题出现在这部分。而不是 $1 我通过了 '2011 -05-01 00:00:00' 是表中的时间戳格式
  • 如果将 $1 替换为特定日期,是否在两个数据库服务器上得到相同的结果?
  • 正如我之前解释的那样,这个查询在我的系统中运行良好并给出了预期的结果,但只是继续在另一个系统中执行并且没有给出结果(系统和 '2011 中的数据相同-05-01 00:00:00' 而不是 $1)
  • 好的,那么您应该检查一下您的 Postgresql 引擎中配置的 DateStyle 参数:postgresql.org/docs/8.2/static/…
猜你喜欢
  • 1970-01-01
  • 2011-09-29
  • 2011-10-13
  • 2010-09-07
  • 2010-10-04
  • 2011-01-15
  • 2021-05-08
相关资源
最近更新 更多