【问题标题】:Why doesn't this query work in SQLite but works fine in MySQL and MSAccess?为什么这个查询不能在 SQLite 中工作,但在 MySQL 和 MSAccess 中工作正常?
【发布时间】:2023-03-22 00:55:01
【问题描述】:

我有一个相当复杂的 SQL 查询,如图所示 in this fiddle

SELECT payer_payment.payer_id, 
       Sum(payer_payment.amount)                             AS total_paid, 
       Sum(payer_payment.pays * payments_share.single_share) AS fair_share 
FROM   payers 
       INNER JOIN (payer_payment 
                   INNER JOIN (SELECT payment_id, 
                                      Sum(amount) / Sum(pays) AS single_share 
                               FROM   payer_payment 
                               GROUP  BY payment_id) AS payments_share 
                           ON payer_payment.payment_id = 
                              payments_share.payment_id) 
               ON payers.id = payer_payment.payer_id 
WHERE  payers.user_id  = 1 
GROUP  BY payer_payment.payer_id; 

在小提琴中,它在 MySQL 上运行良好,但是当我在 SQLite 数据库上运行它时,它要么抛出错误,引用:

(1 没有这样的列:payer_payment.payer_id)

当该列明确存在时。

或者只是返回 0 个结果,具体取决于 SQLite 实现(WebSQL 与 SQLite.js)

这是什么原因?是否有可能使我的查询更加与数据库无关?

【问题讨论】:

标签: mysql sql sqlite


【解决方案1】:

在 SQLite 中,您可以使用 INTEGER PRIMARY KEY 获得一个自动递增的列。 (如果你在查询中依赖payers.id 的实际值,你应该明确地给出它们。)

您不应该在不需要时尝试嵌套连接:

SELECT payer_payment.payer_id,
       Sum(payer_payment.amount)                             AS total_paid,
       Sum(payer_payment.pays * payments_share.single_share) AS fair_share
FROM       payers
INNER JOIN payer_payment
        ON payers.id = payer_payment.payer_id
INNER JOIN (SELECT payment_id,
                   Sum(amount) / Sum(pays) AS single_share
            FROM   payer_payment
            GROUP  BY payment_id) AS payments_share
        ON payer_payment.payment_id = payments_share.payment_id
WHERE payers.user_id = 1
GROUP BY payer_payment.payer_id;

SQLFiddle

【讨论】:

  • 非常感谢,我将在我的本地环境中尝试这个,但嵌套连接可能是原因。重新架构,我只是在 SQFiddle 上测试查询;在我的 Laravel 应用程序上,架构是使用 Laravel 迁移正确构建的,因此将具有自动增量 ID。
  • 罪魁祸首确实是嵌套连接,再次感谢。
猜你喜欢
  • 2014-03-30
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多