好的,我被困在这个。
我有一个PostgreSQL表客户,看起来像这样:
id firm1 firm2 firm3 firm4 firm5 lastname firstname
1 13 8 2 0 0 Smith John
2 3 2 0 0 0 Doe Jane
每行对应一个客户/客户。每个客户/客户可以与一个或多个公司相关联;每个公司#columns下的数值对应于另一个表中的公司ID。
所以我正在寻找一种方法来返回与特定公司相关的所有客户行。
例如,在firm1,firm2,firm3,firm4,firm5中存在的SELECT id,lastname,firstname将返回John Smith行,因为他在firm2列下与公司8相关联。
关于如何实现这一目标的任何想法?
答案 0 :(得分:1)
您应该考虑规范化您的表格,使用当前架构,您应该加入firms
表,与客户表中公司字段的数量一样多。
select *
from customers c
left join firms f1
on f1.firm_id = c.firm1
left join firms f2
on f2.firm_id = c.firm2
left join firms f3
on f3.firm_id = c.firm3
left join firms f4
on f4.firm_id = c.firm4
答案 1 :(得分:1)
您可以使用IN
运算符:
SELECT *
FROM customer
where 8 IN (firm1, firm2, firm3, firm4, firm5);
但是如果你的数据模型标准化,那么从长远来看会好得多。
答案 2 :(得分:1)
您可以使用array
和unnest
的组合“展开”,如此答案中所述:unpivot and PostgreSQL。
在您的情况下,我认为这应该有效:
select lastname,
firstname,
unnest(array[firm1, firm2, firm3, firm4, firm5]) as firm_id
from customer
现在您可以从此表中选择(使用with
语句或内部查询),其中firm_id
是您关注的值