查看PostgresQL

时间:2019-05-07 20:25:05

标签: sql postgresql-9.1

想象一下,有了这个表,我希望能够找到与每个ID相关联的品牌。 请注意,这并不等同于查找每行是否存在该值,因为单个id可能存在多次。 在这种情况下,我期望的结果将是梅赛德斯·奔驰。

 id |    brand1     |    brand2     |    brand3
----+---------------+---------------+---------------
  1 | Mercedes-Benz |               | Fiat
  2 | Honda         |               | Mercedes-Benz
  3 | Audi          |               | Audi
  3 | Audi          |               | Mercedes-Benz
  4 | Mercedes-Benz |               | Mercedes-Benz
  5 | Mercedes-Benz | Mercedes-Benz |
  5 | Mercedes-Benz | Mercedes-Benz |
  6 | Mercedes-Benz |               | Mercedes-Benz
  7 | Mercedes-Benz | Mercedes-Benz |
  8 | Audi          |               | Audi
  8 | Audi          |               | Mercedes-Benz

我尝试使用EXIST,但是我无法在id列中找到一种优雅的“ postgresql”方法进行迭代。

结果:

  |    brand      |  
  +---------------+
  | Mercedes-Benz | 

2 个答案:

答案 0 :(得分:4)

取消数据透视-我建议使用横向联接-然后聚合:

select v.brand
from t cross join lateral
     (values (t.brand1), (t.brand2), (t.brand3)) v(brand)
group by brand
having count(distinct t.id) = (select count(distinct t.id) from t);

答案 1 :(得分:1)

您可以规范化数据(如果可能,请更改表结构,否则您可以运行查询以动态构建数据)

SELECT id, brand1 AS brand FROM table
UNION
SELECT id, brand2 FROM table
UNION
SELECT id, brand3 FROM table

从那里,您可以使用标准的聚合函数来查找所需的信息:GROUP BY品牌,以及COUNT ID