我正在寻找创建一个Python脚本,该脚本显示商店中不再可用的项目(位置1),但在仓库中可用(位置99)。例如。包含需要重新进货的物品的清单。困难在于,库存管理系统不是将商品数量设置为0,而是将数据从数据库中完全删除。此外,项目没有唯一的ID,但是两列的组合是序列号,而列是项目的大小。
(PostgreSQL)数据库为restock
,其中一个表inventory
如下所示:
====================================================================
| serialnumber | size | location | itemcount | season |
--------------------------------------------------------------------
| 1120.10.0369 | 140 | 99 | 8 | 74 |
| 1120.10.0369 | 140 | 1 | 2 | 74 |
| 1120.10.4011 | 170/176 | 99 | 3 | 74 |
| 1120.10.4011 | 170/176 | 1 | 2 | 74 |
| 1120.10.4011 | 86/92 | 99 | 1 | 74 |
| 1120.10.8006 | 158 | 99 | 1 | 74 |
| 1120.10.8006 | 158 | 1 | 2 | 74 |
在上面的示例中,序列号为1120.10.4011
且大小为86/92
的项目位于99
(仓库),但没有序列号为{{1}的行}和大小1120.10.4011
,其中位置为86/92
,因此我希望重新列入要重新锁定的列表中的项目。
我试图通过使用1
查询的计数来显示数据中不存在的项目:
GROUP BY
但是,这不能按预期工作。
问题仍然存在:
或
答案 0 :(得分:1)
您必须在not exists子句中使用subselect:
getresult = """SELECT serialnumber, size FROM inventory i99
WHERE season = 74 AND location = 99
AND NOT EXISTS (SELECT serialnumber FROM inventory i1
WHERE i1.serialnumber = i99.serialnumber
AND i1.size = i99.size
AND i1.location = 1)"""
这是我知道直接在SQL级别找到不存在的值的唯一方法,因为IS NULL
即使在外连接测试中,该值也是原始表,而不是select返回的值。 / p>
答案 1 :(得分:0)
getresult = """
select i99.serialnumber, i99.size, i99.itemcount, i99.season
from
inventory i99
left join
inventory i1 on
(i99.serialnumber, i99.size, i99.season, i1.season, i99.location, i1.location) =
(i1.serianumber, i1.size, 74, 74, 99, 1)
where i1.size is null
"""