Select distinct 在复杂的 pl/pgsql 查询中不起作用

Select distinct not working in complex pl/pgsql query

我在 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 DISTINCT 并且 adidas.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 aidDISTINCT 仍然不起作用,我得到重复的结果。

我该如何解决这个问题?

谢谢

正如您现在看到的,如果您使用 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,则合并语句将 return 非 NULL 值。