【问题标题】:Postgres - How to Join Tables without duplicatesPostgres - 如何加入没有重复的表
【发布时间】:2018-09-21 22:09:30
【问题描述】:

我正在开发一个在本地使用 SQLite 的项目,现在当移动到 PostGres(在 Heroku 上)时,我的查询报告了一个错误“r.social 必须出现在 GROUP BY 子句中或用于聚合函数中”

原来的查询是:

SELECT  DISTINCT c.name, r.social, c.description, p.price
            FROM cryptomodels_coin c  
            LEFT JOIN cryptomodels_coinprice p
            ON  p.coin_id  =  c.name
            LEFT JOIN cryptomodels_CoinRating r 
            ON r.coin_id = c.name
            GROUP BY c.name

这在本地运行良好,每个硬币返回一个唯一的行

当我将它添加到 PostGres 环境时,它抛出了上面提到的聚合函数错误 - 我设法通过将所有列添加到“Group by”子句来解决这个问题,如下所示:

   SELECT  DISTINCT c.name, r.social, c.description, p.price
                FROM cryptomodels_coin c  
                LEFT JOIN cryptomodels_coinprice p
                ON  p.coin_id  =  c.name
                LEFT JOIN cryptomodels_CoinRating r 
                ON r.coin_id = c.name
                GROUP BY c.name, r.social, c.description, p.price

问题是我现在每个硬币都有重复的行

我已经阅读并尝试了许多解决方案,其中一些会引发错误,而另一些仍然会导致重复行,真的不知道如何继续,谢谢您的帮助

编辑以获取更多信息: 每个硬币都有许多价格和许多评级,cryptomodels_coin 表被其他表引用,使用它的名称作为“coin_id”,例如三个硬币:

Coin table: 
| Name | 
--------
|  0X  |
| XSV  | 
| BTC  |

Price table: 
| Coin_id | Price |
-------------------
| 0X      |  43.2 |
| XSV     |  20.0 |
| BTC     |  99999| 

Rating table:
| Coin_id | Social|
-------------------
| 0X      | 20,000|
| XSV     | 12,000|
| BTC     | 5,0000| 

编辑2:

 CREATE TABLE "cryptomodels_coin" (
 "name" varchar(200) NOT NULL PRIMARY KEY, 
 "description" text NOT NULL);

CREATE TABLE "cryptomodels_coinprice" (
 "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, 
 "price" real NULL, 
 "coin_id" varchar(200) NOT NULL REFERENCES "cryptomodels_coin" ("name") );

CREATE TABLE "cryptomodels_coinrating" (
 "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, 
 "social" text NULL, "coin_id" varchar(200) NOT NULL REFERENCES "cryptomodels_coin" ("name"));

添加了 SQLFiddle: http://sqlfiddle.com/#!15/9fcff/1 谢谢!

【问题讨论】:

  • 你能提供一些测试数据吗?
  • 在表cryptomodels_coinrating 中,列social 是否真的引用了cryptomodels_coin 中的name。如果是这样,则您的数据样本不一致。

标签: django postgresql sqlite duplicates


【解决方案1】:

我想这样的事情会如你所愿地消除重复:

SELECT c.name AS name, 
       r.social AS social, 
       c.description AS description, 
       SUM(p.price) AS price
FROM cryptomodels_coin c  
LEFT JOIN cryptomodels_coinprice p ON  p.coin_id  =  c.name
LEFT JOIN cryptomodels_CoinRating r ON r.coin_id = c.name
GROUP BY c.name,r.social,c.description 

【讨论】:

  • 嗨吉姆!感谢您的回复 - 不幸的是,这仍然会带来重复,根据您的评论,我还将在原始问题中添加更多信息
  • 如果可以的话,还要加上create table语句
  • 现在将添加这些
  • 已更新构建语句,谢谢 - 当我完成您的查询时,它仍然需要所有内容都在 group by 语句中,因此虽然它在 Sqlite 上仅使用 c 来处理唯一行。名称,它们仍然会出现重复,所以很困惑,谢谢
  • 这样的东西会更接近你想要的吗? sqlfiddle.com/#!15/9fcff/2/0
猜你喜欢
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 2019-11-25
相关资源
最近更新 更多