查询不在列表中的项目,而不在一列中具有唯一ID

时间:2017-10-10 10:00:13

标签: python postgresql psycopg2

我正在寻找创建一个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

但是,这不能按预期工作。

问题仍然存在:

  • 如何检索数据库中缺少行的列表?

  • 如何检索包含行号的列表,其中序列号+大小适用于位置99但不存在且位置为1?

2 个答案:

答案 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
"""