在PostgreSQL中找到两个结果集之间的公共元素

时间:2018-08-21 08:33:20

标签: postgresql

我已经创建了以下表格。

CREATE TABLE table1 (
   idx SERIAL PRIMARY KEY,
   refs_person TEXT[],
   id_gps TEXT
);
CREATE TABLE table2 (
   idx SERIAL PRIMARY KEY,
   id_person TEXT,
   city TEXT,
   location INTEGER
);

我用这些信息填充了他们。

表1

idx  || refs_person                           ||  id_gps
 1   || {id_per_234, id_per_456}              ||  gps_20 
 2   || {id_per_568}                          ||  gps_23
 3   || {id_per_345, id_per_334, id_per_340}  ||  gps_45

表2

idx  || id_person    || city  || location
 1   || id_per_234   || Paris ||   20
 2   || id_per_999   || York  ||   20
 3   || id_per_213   || Paris ||   20
 4   || id_per_334   || Paris ||   32

如果我尝试在巴黎 中找到位置为 20 id_person

select id_person from table2 where city = 'Paris' and location = '20';
    id_per_234
    id_per_213

然后,如果我尝试为表1找出 id_gps 20 refs_person

 select refs_person from table1 where id_gps = '20';
       {id_per_234, id_per_456}  

我在寻找这两个结果之间的共同点时遇到了一个问题。

对于此示例,我想获取 id_per_234 。 我尝试使用 intersect 语句没有成功。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您需要unnest数组,最好使用LATERAL连接,然后才能INTERSECT结果:

SELECT rp.rp
   FROM table1
      CROSS JOIN LATERAL unnest(table1.refs_person) AS rp(rp)
   WHERE id_gps = 'gps_20'
INTERSECT
SELECT id_person
   FROM table2
   WHERE city = 'Paris' AND location = 20;

     rp     
------------
 id_per_234
(1 row)