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 aid
, DISTINCT
仍然不起作用,我得到重复的结果。
我该如何解决这个问题?
谢谢
正如您现在看到的,如果您使用 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 值。
我在 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 aid
, DISTINCT
仍然不起作用,我得到重复的结果。
我该如何解决这个问题?
谢谢
正如您现在看到的,如果您使用 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 值。