2017-10-10 14 views
1

店舗では利用できなくなった(場所1)が表示されるPythonスクリプトを作成しようとしています。倉庫(場所99)。例えば。補充が必要なアイテムのリスト。問題は、店舗のアイテム数を0にする代わりに、在庫管理システムはアイテムをデータベースから完全に削除するだけです。項目には一意のIDはありませんが、シリアル番号である2つの列とアイテムのサイズの列が組み合わされています。1つの列に一意のIDを持たずに、リストにない項目を照会します。

(PostgreSQLの)データベースがこのように見て一つのテーブルinventoryrestockである:上記の例で

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

LEFT JOINはまだ試しましたか? –

答えて

1

あなたは存在しない句で副選択を使用する必要があります。IS NULLでもANであるため、

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レベルで実在しない値を見つけるために私が知っている唯一の方法です外部結合テストは値が元のテーブルであり、選択によって返されるものではありません。

+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'句が元のテーブルの値に使用され、ヌル・サイズを含む行がないため、この問合せはまったく行を戻しません。 –

関連する問題