2015-10-07 52 views
0

我在使用IN加入两个表时遇到问题。 例子:SQL加入运营商IN

with nodes(node_id, mpath) as (
SELECT node_id, drugs_cls_node_view.mpath 
FROM drugs_cls_entries_view 
    inner join drugs_cls_node_view on drugs_cls_node_view.id = node_id 
WHERE mnn_id in (13575) 
) 
select DISTINCT n.node_id, drugs_cls_node_view.* 
from nodes n 
    inner join drugs_cls_node_view 
    on drugs_cls_node_view.id in (array_replace(string_to_array(n.mpath, '/'), '', '0')::bigint[]) 

我得到异常:

ERROR: operator does not exist: bigint = bigint[]

+3

答案是肯定的,你可以使用IN连接两个表。 – jarlh

+0

@jarlh但我得到了异常:'错误:操作符不存在:bigint = bigint []' – Wolkodav

+0

请[将您的查询简化为重现问题所需的最小值](http://stackoverflow.com/help/mcve) 。这会让问题更加明确。 – IMSoP

回答

1

随着

on drugs_cls_node_view.id in 
    (array_replace(string_to_array(n.mpath, '/'), '', '0')::bigint[]) 

您要查找的ID在只包含一个元素的集合。这个元素是一个数组。 ID不能等于数组,因此错误。

必须UNNEST数组都是单值与比较:

on drugs_cls_node_view.id in 
    (select(unnest(array_replace(string_to_array(n.mpath, '/'), '', '0')::bigint[]))) 

或使用任何阵列,而不是在:

on drugs_cls_node_view.id = ANY 
    (array_replace(string_to_array(n.mpath, '/'), '', '0')::bigint[]) 

有可能是在我的代码语法错误,因为我不是postgres家伙,但它应该可能在这里或那里稍微修正:-)

+0

为什么在这个查询中'ANY'与'LIKE'相比较慢? – Wolkodav

+0

我不明白这个问题,但不是一个postgres的人,我不太可能回答它:-)数组和'= ANY'是特殊的PostgreSQL特性。 –