【问题标题】:Select distinct not working in complex pl/pgsql query选择不同的在复杂的 pl/pgsql 查询中不起作用
【发布时间】:2018-12-02 18:10:08
【问题描述】:

我在 pl/pgsql 函数中有这个查询。我正在使用 PostgreSQL 10。

FOR firstrecord IN 
EXECUTE format( 

 'SELECT  vans.id as vid, adidas.id as aid, 
 vans.color, adidas.color, vans.type, adidas.type 
 FROM shoes 
 FULL JOIN adidas ON shoes.id = adidas.id 
 FULL JOIN shoes ON shoes.id=vans.id
 WHERE  adidas.code = 607 and vans.code = 304 '  )              

 USING acode , vcode 

END LOOP;

这可行,但我想在 vans.id 上强制执行 SELECT DISTINCTadidas.id。 这是我得到的最接近的

FOR firstrecord IN 
EXECUTE format( 

 'SELECT DISTINCT ON  (adidas.id)  vans.id as vid, adidas.id as aid, 
 vans.color, adidas.color, vans.type, adidas.type 
 FROM shoes 
 FULL JOIN adidas ON shoes.id = adidas.id 
 FULL JOIN shoes ON shoes.id=vans.id
 WHERE  adidas.code = 607 and vans.code = 304 
 ORDER BY adidas.id,vans.id'  )              

 USING acode , vcode 

END LOOP;

如果我尝试执行SELECT DISTINCT ON (adidas.id, vans.id) 之类的操作,DISTINCT 不起作用,我会得到重复的结果。

如果我这样做 SELECT DISTINCT vans.id as vid, adidas.id as aid ,仍然 DISTINCT 不起作用,我会得到重复的结果。

我该如何解决这个问题?

谢谢

【问题讨论】:

  • Edit您的问题并添加一些sample data 和基于该数据的预期输出。 Formatted textno screen shotsedit 您的问题 - 请不要在 cmets 中提供邮政编码或其他信息。
  • 可能有更好的解决方案,但请先澄清一些问题:您的FROM 列表中有两次shoes。第二个是错字,应该是vans?在编辑您的问题时,还请解释查询应该实现什么,以及为什么您使用带有EXECUTE 的动态SQL,这似乎没有必要。您甚至没有引用 USING 子句中提供的参数,即使您这样做也不需要动态 SQL ...

标签: postgresql group-by sql-order-by distinct plpgsql


【解决方案1】:

正如您现在所看到的,如果您使用 DISTINCT ON(expression1, expression2) 它会将两个表达式的所有组合视为不同的,包括当一个为 NULL 时与任何非 NULL 值不同。似乎您只需要一个表达式来考虑两个表中的 id。您可以使用 coalesce 函数来获得它,如下所示:

SELECT DISTINCT ON  ( coalesce(adidas.id, vans.id))  vans.id as vid, adidas.id as aid, 
vans.color, adidas.color, vans.type, adidas.type 
FROM shoes 
FULL JOIN adidas ON shoes.id = adidas.id 
FULL JOIN vans ON shoes.id = vans.id
WHERE  adidas.code = 607 and vans.code = 304 
ORDER BY coalesce(adidas.id, vans.id)

这在这种情况下有效,因为如果两者都是非 NULL,它们应该相互匹配,如果一个是 NULL,则 coalesce 语句将返回非 NULL 值。

【讨论】:

  • 使用coalesce 的好主意。谢谢
猜你喜欢
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
相关资源
最近更新 更多