【问题标题】:Postgres Query WHERE arrayPostgres 查询 WHERE 数组
【发布时间】: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_idtransport_list_id 的组合在 carrier_transport 中应该是唯一的。您从表中选择每个 carrier_id 具有 transport_list_id 1 和 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


【解决方案1】:
select ct.carrier_id
from
    transportlist tl 
    inner join
    carrier_transport ct on ct.transport_list_id = tl.id
where ct.transport_list_id in (1,2) 
group by 1
having bool_or(tl.id = 1) and bool_or(tl.id = 2)

Aggregate functions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多