2017-12-14 12 views
1

私は初心者で、Pythonでマルチスレッドを行う方法を学んでいます。 SQLクエリが必要です(私は複雑なSQLのものにすぐに潜入する準備ができていません)。私はMS Accessをデータベースとして使用しています。同時に選択して更新しますか?

ComputerName,isPing,inProgressの3つのフィールドがあります。現在のところinProgressではないComputerNameの1つを選択するために必要なSQLクエリは、inProgressと同じ時刻にとしてマークされています。

SELECT TOP 1 
    Table1.ComputerName, 
    Table1.isPing, 
    Table1.inProgress 
FROM Table1 
WHERE (((Table1.inProgress) = FALSE)); 

UPDATE Table1 
SET Table1.inProgress = TRUE 
WHERE (((Table1.ComputerName) = [Enter computer name:])); 
+1

同じステートメントで選択と更新を行うことはできません。通常、この問題はストアドプロシージャまたはトランザクションを使用して処理されます。どちらも選択/更新(更新/選択?)をアトミックに実行できます。 –

+0

@ tim-biegeleisenどのように問題にアプローチすることをお勧めしますか?潜在的に私はいくつかのコンピュータ上で私のプログラムを実行して、pingの処理をスピードアップさせたいと思っています – user2978216

+0

あなたの質問を編集し、selectとupdateステートメントを含めてください。たぶん我々は両方を1つのアップデートに組み合わせることができます。 –

答えて

0

WHERE句にアクセスしてサブクエリでTOPを使用することが可能であるように思われます。あなたは、マッチングのに関しては何のロジックを提供されていないので、ORDER BY句を使用せずにTOP 1を使用して使用することは、あまり意味がないことを

UPDATE Table1 
SET inProgress = True 
WHERE ComputerName = (SELECT TOP 1 ComputerName FROM Table1 WHERE inProgress = False) 

注:もしそうなら、あなたは、次のUPDATEステートメントを使用して試すことができます最初にレコードを選択する必要があります。上記のサブクエリにORDER BYを追加することをお勧めします。また、コメントに記載されているように、同時に更新と選択を行うことはできません。元のSELECTのフィールドが本当に必要な場合は、そのために別のクエリ/ステートメントが必要です。 1つの選択肢は、タイムスタンプで更新をラベル付けし、その事実の後で最も最近更新されたレコードを選択することができる。

+0

トップ1は、特定のスレッドが特定のComputerNameで動作することの意味です。単一のスレッドには単一のComputerNameが必要です。スレッドは、他のスレッドが動作しているコンピュータ名を知らない。この更新クエリは、スレッドが動作するようなコンピュータ名を提供しません。 – user2978216

+0

私の答えは私がすでに持っている以上に説明できません。 –

関連する問題