代码之家  ›  专栏  ›  技术社区  ›  Michiel Roses

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

  •  1
  • Michiel Roses  · 技术社区  · 8 年前

    我希望创建一个Python脚本,显示商店(位置1)中不再可用但仓库(位置99)中可用的项目。E、 g.需要重新进货的物品清单。困难在于,库存管理系统没有将门店的商品数量设置为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"
    

    然而,这并没有像预期的那样起作用。

    问题仍然存在:

    • 我如何检索具有行的列表,其中serialnumber+大小在位置99处,但不在位置1处?
    2 回复  |  直到 8 年前
        1
  •  1
  •   Serge Ballesta    8 年前

    您必须在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返回的值。

        2
  •  0
  •   Clodoaldo Neto    8 年前
    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
    """