想象一下,有了这个表,我希望能够找到与每个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 |
答案 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