【问题标题】:Get all records that have ALL values passed as parameters获取将所有值作为参数传递的所有记录
【发布时间】:2022-11-19 00:53:08
【问题描述】:

我有一个属性表:

+----+-----------------------------+
| prop_id | prop_name              |
+---------+------------------------+
| 1       | Cottage                |
+---------+------------------------+
| 2       | Mountain House         |
+---------+------------------------+
| 3       | Beach house            |
+---------+------------------------+

附件一表:

+----+-----------------------------+
| acc_id  | acc_name               |
+---------+------------------------+
| GAR     | With garden            |
+---------+------------------------+
| TER     | With terrace           |
+---------+------------------------+
| REN     | Recently renovated     |
+---------+------------------------+

关联属性和附件的表(properties2accessories):

+----+--------------+
| prop_id | acc_id  |
+---------+---------+
| 1       | GAR     |
+---------+---------+
| 1       | REN     |
+---------+---------+
| 2       | GAR     |
+---------+---------+
| 2       | REN     |
+---------+---------+
| 2       | TER     |
+---------+---------+
| 3       | GAR     |
+---------+---------+
| 3       | TER     |
+---------+---------+

我需要所有的属性全部我作为参数传递的配件。

正确的例子:

a) 带有“花园”和“最近装修”的房产:

我应该得到道具:1、2

b) 带有“花园”和“露台”的属性:

我应该得到道具:2、3

我尝试:

SELECT *
FROM properties2accessories
WHERE acc_id IN ('GAR', 'REN');

但这也得到了道具 3,但没有“最近翻新”

我正在使用 Postgres 13

有帮助吗?

【问题讨论】:

    标签: sql postgresql relational-division


    【解决方案1】:

    如果特定 id 存在另一个条件,您可以检查 exists

    SELECT
    "prop_id"
    FROM properties2accessories p 
    WHERE ("acc_id" = 'GAR') 
    AND EXISTS (SELECT 1 FROM properties2accessories WHERE "acc_id" = 'REN' AND  "prop_id" = p."prop_id")
    
    prop_id
    1
    2
    SELECT 2
    

    fiddle

    【讨论】:

      【解决方案2】:

      你可以这样做:

      SELECT prop_id from (
       select prop_id, array_agg(acc_id) acc_array
       FROM properties2accessories
       group by prop_id) d
      WHERE array['GAR', 'REN'] <@ acc_array;
      

      【讨论】:

        【解决方案3】:

        这就是 HAVING 可以为你做的,它是整个组的 WHERE 条件:

        SELECT  prop_id
        FROM    properties2accessories
        WHERE   acc_id IN ('GAR', 'REN')
        GROUP BY prop_id
        HAVING  ARRAY_AGG(acc_id) @> ARRAY['GAR', 'REN'];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-30
          • 1970-01-01
          • 2013-11-03
          • 2020-05-25
          • 1970-01-01
          • 2023-04-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多