查询不在列表中,且一列中没有唯一id的项

2024-10-02 22:27:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望创建一个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(仓库)中找到,但是没有序列号为1120.10.4011、大小为86/92、位置为1的行,所以我想在列表中重新进货的商品。你知道吗

我试图通过在GROUP BY查询中使用计数来显示数据中不存在的项:

getresult = "SELECT serialnumber, size, location, itemcount, season, COUNT(*)" + \
            "FROM inventory " + \
            "WHERE season = 74" + \
            "AND location != 1" + \
            "GROUP BY serialnumber, size " + \
            "HAVING COUNT(*) < 1"

然而,这并不像预期的那样有效。你知道吗

问题仍然存在:

  • 如何从数据库中检索缺少行的列表?你知道吗

或者

  • 我如何检索一个列表,其中的行在位置99处有serialnumber+size,但不在位置1处?你知道吗

Tags: 项目数据库列表sizegrouplocation仓库商品
2条回答

必须在not exist子句中使用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返回的值。你知道吗

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

相关问题 更多 >