Выберите отдельный не работает в сложном запросе pl / pgsql - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть этот запрос в функции 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;

Это работает, но я бы хотел установить SELECT DISTINCT на vans.id И 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 aid, все равно DISTINCT не работает, в результате я получаю дубликаты.

Как мне это исправить?

Спасибо

1 Ответ

0 голосов
/ 02 декабря 2018

Как вы видите сейчас, если вы используете DISTINCT ON (выражение1, выражение2), он будет считать все комбинации двух выражений как отличные, в том числе, когда одно равно NULL, как отличное от любого значения, отличного от NULL.Похоже, вам нужно только одно выражение, которое учитывает идентификаторы из обеих таблиц.Вы можете получить это, используя функцию 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 вернетненулевое значение.

...