0

我有一张桌子scraped_listings和一张桌子scraped_categories。该列scraped_listings.categories是一个整数 [] 数组,其中包含scraped_categories.

不知何故(可能是由于我不记得犯过的错误),一些 scraped_listings 行的类别中的 id 不属于类别行(我怀疑这些行已被删除)。

我有以下查询,它给了我受影响的行:

SELECT * FROM scraped_listings a
JOIN (
  SELECT array_agg(id) AS ids
  FROM scraped_categories
  ) b ON NOT a.categories <@ b.ids;

我现在想做的是从categories该查询找到的行中删除无效的 id - 如果数组中的项目不是有效的 scraped_category id,则应该删除它。

我该怎么做?

4

1 回答 1

1

Postgres 9.2 或更早版本

UPDATE scraped_listings s
SET   categories = up.categories
FROM (
    SELECT a.pkey, array_agg(a.id) AS categories
    FROM  (
        SELECT pkey, unnest (categories) AS id
        FROM   scraped_listings
        ) a
    JOIN scraped_categories s USING (id) -- eliminates unwanted ids
    ) up
WHERE s.pkey = up.pkey

pkey是 的未公开主键列scraped_listings

在 Postgres 9.3中,您将LATERAL用于相关unnest()

UPDATE scraped_listings s
SET   categories = up.categories
FROM (
    SELECT a.pkey, array_agg(a.id) AS categories
    FROM  (
        SELECT pkey, c_id AS id
        FROM   scraped_listings l, unnest(l.categories) c_id  -- implicit LATERAL
        ) a
    JOIN scraped_categories s USING (id) -- eliminates unwanted ids
    ) up
WHERE s.pkey = up.pkey

或者您安装附加模块intarray,为 提供附加运算符int[],例如:

int[] - int     int[]   remove entries matching right argument from array
于 2013-10-22T15:52:35.573 回答