0

以下のクエリを思いつきました。

SELECT ROOMNO,BUILDINGNO 
FROM MRM_ROOM_DETAILS 
WHERE ROOMID IN (
    SELECT distinct roomid 
    FROM MRM_BOOKING_DETAILS 
    WHERE (CHECKIN NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00') 
    AND (CHECKOUT NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00')) 
AND CAPACITY > 15 
AND PROJECTIONSTATUS = 'NO';

このクエリをメソッド SQLiteDatabase.query() に配置し、それに応じて行をフェッチする必要があります。この大きな where 条件 (サブクエリも含む) を「文字列選択」、つまりメソッドの 3 番目のパラメーターの代わりに配置する方法を理解できません。where部分全体(サブクエリを含む)を3番目のパラメーターの文字列として単純に記述しますか、それとも同じことを行うための他のより良い方法がありますか?

同じことをするための最良の方法を教えてください。

よろしく、

4

2 に答える 2

1

私は間違いなく、クエリではなくrawQueryを使用します。ここで重要なのは、selectionArgs引数を使用してインジェクションを防ぐことです。

string sql = "SELECT ROOMNO,BUILDINGNO 
FROM MRM_ROOM_DETAILS 
WHERE ROOMID IN (
    SELECT distinct roomid 
    FROM MRM_BOOKING_DETAILS 
    WHERE (CHECKIN NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00') 
    AND (CHECKOUT NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00')) 
AND CAPACITY > 15 
AND PROJECTIONSTATUS = 'NO';";
db.rawQuery(sql, null); // <---- here null would be replaced with your 
                        // parameters in order to prevent injection
于 2012-04-14T11:40:29.527 に答える
0

selectionはい、 SqliteDatabase.query()の引数として、完全な「WHERE 条件」(逐語的なサブクエリを含む「WHERE」を除く) を指定するだけです。

心配する必要があるのはパフォーマンスです。データベース デバイスで遭遇する SQLite のバージョンを事前に知ることはできません。サブクエリは、特に LIMIT 句と組み合わせると、パフォーマンスが低下することが知られています。

多数のデバイスでこのクエリを必ずテストしてください (影響を受ける行の量が些細な場合を除きます)。複数のステートメントに分割することで、ある程度のパフォーマンスが得られる場合があります。最初に予約の詳細を取得し、部屋の詳細を取得します。

于 2012-04-14T11:41:38.310 に答える