2011-11-14 7 views
2

問題は、両方のテーブルにプライマリキーがあり、他の標準SELECTS/INSERTSで問題が発生していないことです。私はJOINSの新人ですが、なぜこれがうまくいかないのか分かりません。 deviceid/usernamePostgreSQLのINNER JOINクエリで 'No Primary Key'エラーが発生しました

org.postgresql.util.PSQLException: No primary key found for table devicetable. 

しかし、両方のテーブルの主キーは、私が選択してるのカラムは次のとおりです。私は

は、このエラーメッセージが表示されます。おそらくこれには関係がありますか?

私はSQLでJDBC

PreparedStatement query = curSQL.getConn().prepareStatement("SELECT devicetable.pushid FROM devicetable, usertable WHERE usertable.username=? AND usertable.deviceid = devicetable.deviceid", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 
query.setString(1, username); 
ResultSet rs = query.executeQuery(); 

if (rs.next()){ 
    rs.updateString("pushid", pushID); 
    rs.updateRow(); 
} 

rs.close(); 
query.close(); 

経由でアクセスしています:

SELECT devicetable.pushid FROM devicetable, usertable 
WHERE usertable.username=? 
AND usertable.deviceID = devicetable.deviceID 
+1

明示的な結合を試したことがありますか? 'FROM devicetable JOIN usertable on usertable.deviceID = devicetable.deviceID'を実行し、WHERE句から' usertable.deviceid = devicetable.deviceid'部分を削除してください。 –

+0

これはうまくいった!答えとして入れて、私はそれを受け入れます。 – user705142

+1

面白い、私は元々答えとして(私の答えのタイムスタンプ)しかし、私はそれを削除し、代わりにコメントのために行きました。とにかく、私は答えを元に戻しました。 –

答えて

2

は明示してみてください参加:SELECTで

SELECT devicetable.pushid 
FROM devicetable 
JOIN usertable ON usertable.deviceID = devicetable.deviceID 
WHERE usertable.username = ? 
1

JOIN句はには何もしています主キーで何でもする。 のいずれかの SELECTクエリに対してプライマリキーを定義する必要はありません。

副作用は、重複する行を取得する可能性がありますが、それはまったく別の問題です。

実際には、クエリには明示的なJOINがあります。あなたは、明示的にクエリを書き直すことができ、この同等のように登録しよう:

SELECT devicetable.pushid 
FROM devicetable 
JOIN usertable USING (deviceID) 
WHERE usertable.username=? 

JOIN syntax in the manualについては、こちらをご覧ください。