Postgresql为我们列中查询的元素选择另一列的公共元素

时间:2015-09-02 09:29:13

标签: sql postgresql

表(两列都不是唯一的,没有主键)

 C1     |    C2
 ===============
 2      |    1
 3      |    1
 4      |    1
 4      |    2
 4      |    3
 5      |    1
 5      |    2
 6      |    1
 6      |    3
 7      |    1

如果我查询C1列的3和4,我应该得到下表。不是特定的查询我可以在列而不是3或4中查询其他内容。

结果:

C1     |    C2
===============
 3      |    1
 4      |    1

2 个答案:

答案 0 :(得分:1)

您可以尝试:

SELECT C1, C2
FROM (
  SELECT C1, C2, COUNT(C1) OVER (PARTITION BY C2) AS cnt
  FROM (
    SELECT DISTINCT C1, C2
    FROM mytable
    WHERE C1 IN (3,4) ) t ) s
WHERE s.cnt = 2  

COUNT的窗口版本用于计算每个C1分区中C2不同次数的数量。如果此数字等于2,那么我们显然有匹配。

请注意,需要额外级别的子查询,具有DISTINCT子句的子查询,因为Postgresql不支持COUNT(DISTINCT ...) OVER ...

Demo here

答案 1 :(得分:0)

试试这个

select c1,min(c2) as c2 from table
where c1 in (3,4)
group by c1