2017-10-10 37 views
1

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

然而,由于预期这不起作用。

的问题依然存在:

  • 我如何可以检索行从数据库中缺少一个列表?

或者

  • 我如何可以检索与其中SERIALNUMBER +大小为有99位,但不存在以1:1的位置排列表?
+1

您是否尝试过与自己的左连接? –

回答

1

您必须在不存在子句中使用子查询:

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将返回的值。

+0

事实上,子选择中的NOT EXIST并没有这样做。谢谢Serge! –

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

感谢您的建议。尝试以上,它会导致显示数据库中的所有行。它似乎没有过滤季节,也没有位置。我会阅读LEFT JOIN,但任何其他指针将不胜感激。 –

+0

如果您删除'where i1.size is null',并在Python级别测试None值,您将得到正确的结果。但是,由于where子句用于来自原始表的值,并且由于没有行包含空值大小,因此此查询将根本不返回任何行。 –

相关问题