【问题标题】:Remove duplicates from results in SQL on JOINS从 JOINS 上的 SQL 中的结果中删除重复项
【发布时间】:2020-05-13 03:33:54
【问题描述】:

我想进行一个查询,它不会从表 2 中获取两个 AAA BBB 值。每当我使用 JOIN 运行查询(我尝试了所有不同的连接)时,它都会在结果中给我重复的值( 001 - AAA 和 001 - BBB)。结果查询应该只有 3 个值 AAA CCC DDD。这甚至可能吗?

SELECT *, ST_AsGeoJSON(geom,5) AS geojson  FROM table1  
LEFT JOIN table2 ON table.id2=table2.id2
GROUP BY table.id2

我尝试了上面的查询,但它出错了。列“table2.Id2”必须出现在 GROUP BY 子句中或用于聚合函数中

table 1

    id  test        

    001  |  A
    002  |  B
    003  |  C
    007  |  D

table2
id2(fk)  test2      

001    |  AAA
001    |  BBB
003    |  CCC
007    |  DDD

我对 SQL 还很陌生,所以我很抱歉。 任何帮助将不胜感激。 谢谢!

【问题讨论】:

  • 您的预期输出是什么?
  • 我让它与 SELECT DISTINCT 一起工作。有没有其他方法可以做到这一点?
  • 可能有,但不清楚你真正想要什么。
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出您可以给出的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 停止尝试编写您的总体目标并从给定的代码中解释您的期望以及原因。
  • 您的错误信息是一个常见问题。在考虑发布之前,请阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。 PS 请通过编辑而不是 cmets 澄清。

标签: sql postgresql join


【解决方案1】:

尝试以下操作,您会收到错误,因为您没有在您的 group by 中包含 table2.id2

SELECT *, 
    ST_AsGeoJSON(geom,5) AS geojson  
FROM table1  t1
LEFT JOIN table2 t2
ON t1.id2=t2.id2
GROUP BY 
 t1.id2,
 t2.id2

【讨论】:

    【解决方案2】:

    您根本不需要GROUP BY。您没有聚合函数:

    SELECT *, ST_AsGeoJSON(geom, 5) AS geojson 
    FROM table1 LEFT JOIN
         table2
         ON table1.id2 = table2.id2;
    

    如果您希望每个id2 有一行,您可以使用DISTINCT ON

    SELECT DISTINCT ON (table1.id2) *, ST_AsGeoJSON(geom, 5) AS geojson 
    FROM table1 LEFT JOIN
         table2
         ON table1.id2 = table2.id2
    ORDER BY table1.id2;
    

    注意:当有重复时,这将返回一个 任意 匹配行。如果您想要一个 特定的 值,则将第二个键添加到 ORDER BY

    【讨论】:

    • 感谢您的回复!嗯,现在看来我现在不能订购了。 SELECT DISTINCT ON (eats2.id2) id2, * FROM eats2 LEFT JOIN eats2_imgs ON eats2.id2=eats2_imgs.id2_eats2; ORDER BY eats2.id2 错误:“ORDER”处或附近的语法错误
    • 我让它像这样工作。 SELECT DISTINCT ON (eats2.id2,eats2.score) * FROM eats2 LEFT JOIN eats2_imgs ON eats2.id2=eats2_imgs.id2_eats2 ORDER BY eats2.score DESC 谢谢伙计!
    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 2020-12-25
    • 2015-09-01
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多