比较外键 - PostgreSQL

Neo*_*oVe 1 sql postgresql

我遇到了这个问题:

仓库内的库存由以下数据库表中的行表示:

CREATE TABLE stock (
  id SERIAL,
  product_id integer NOT NULL REFERENCES products ( id ),
  location_id integer NOT NULL REFERENCES locations ( id ),
  package_id integer REFERENCES packages ( id ),
  qty integer
);
Run Code Online (Sandbox Code Playgroud)

鉴于物理限制,同一包装内的任何产品都必须出现在仓库内的同一位置。不幸的是,由于应用程序层中的错误,某些数据库行违反了此约束。

stock 表中大约有 200 万行。

编写数据库查询来识别受影响的行。

现在,我知道这product_id是一个外键,以及表上的location_id外键,但不知怎的,我对如何实现这一点感到非常困惑。package_idstock

我想过的一件事是将包装与产品进行比较,但我仍然陷入困境,因为问题是,当产品上的包装相同时,它们的位置应该相同。所以,我还没有看到大局。

我对这个问题有点了解,哈哈,关于如何处理它有什么想法吗?

kli*_*lin 5

该查询应该找到由(product_id, package_id)具有多个 的对标识的包location_id

select product_id, package_id, count(distinct location_id)
from stock
group by product_id, package_id
having count(distinct location_id) > 1
Run Code Online (Sandbox Code Playgroud)

不幸的是,由于应用程序层中的错误,某些数据库行违反了此约束。

不。不幸的是,该模型不正确。位置应按包装引用,而不是按库存引用。