【发布时间】:2017-01-25 20:22:16
【问题描述】:
我的 Postgres 查询有问题。
我有 3 张桌子:
1) Carrier
*id
*name
*telephone
*address
*comments
2) Transportlist
*id
*name
3) Carrier_transport
*id
*carrier_id
*transport_list_id
例如:
Carrier: Transportlist: Carrier_transport:
ID | name ID | name ID | carrier_id | transport_list_id
1 | ABC 1 | Car 1 | 1 1
2 | XYZ 2 | Tir 2 | 1 2
3 | 111 3 | Plane 3 | 1 3
4 | ferry 4 | 2 1
5 | 3 4
6 | 3 3
7 | 3 2
我必须只选择具有运输列表 Car AND Tir 的承运人
我试过了:
Select FROM Carrier c
LEFT JOIN Carrier_transport ct ON (ct.carrier_id = c.id)
WHERE ct.transport_list_id IN (1,2)
GROUP BY c.id
HAVING COUNT(*)>=2
但是这个解决方案是错误的。
有人可以帮助我吗?
【问题讨论】:
-
HAVING COUNT(distinct ct.transport_list_id)>=2 -
但是,如果承运人 x 有 CAR 类型的运输列表之一和 10 个不同的运输列表怎么办。它有 COUNT >=2 但我只需要一个元素
-
我看不出查询有什么问题。
carrier_id和transport_list_id的组合在carrier_transport中应该是唯一的。您从表中选择每个 carrier_id 具有transport_list_id1 和 2 的所有记录,并计算您是否有两条记录(即 1 和 2)的运营商。究竟什么不起作用? -
如果运营商有 transport_list_id 1 和 3,则只有 transport_list_id 为 1 的记录被选中(因为 3 与
transport_list_id IN (1,2)不匹配)。一条记录 => COUNT(*) = 1 => 未显示运营商 (HAVING COUNT(*)>=2)。这正是你想要的,不是吗? -
这通常是这样写的,比如
HAVING COUNT(*) = 2(或者计算一个特定的id——它永远不会大于2,因为你的WHERE谓词)。此外,由于相同的WHERE谓词,您的LEFT JOIN变为INNER之一。除了SELECT之后的明显语法错误之外,您的查询很好:它应该可以工作。它到底有什么错误?
标签: postgresql select having