0

ユーザーの認証 (ユーザー名とパスワード) を格納するテーブルと設定を格納するテーブルの 2 つのテーブルを持つ非常に単純なデータベースがあります。現在、私のアプリが初期化されると、最初に設定がチェックされ、次に認証されます。でも一気に掴みたい。アプリの設計方法では、どちらのテーブルにもレコードが 1 つしかないため、クエリで WHERE 句を使用しません。

問題は、クエリを個別に実行すると、結合した場合とは異なる結果が得られることです。

次のシナリオを検討してください。ユーザーがログインし、いくつかの設定を行ってからログアウトします。5 月のアプリでは、これにより認証テーブルがクリアされますが、設定はそのまま残ります。

サインアウト クエリ (認証テーブルをクリアするだけ)

db.transaction(function(tx) {
    tx.executeSql('DELETE FROM userdata');
}, errorDB);

ただし、これは「0行が見つかりました」と出力します。

db.transaction(function(tx) {
    tx.executeSql('SELECT USERDATA.*, PREFS.* FROM USERDATA, PREFS', [], function (tx, results) {
         var len = results.rows.length;
        console.log(len + " rows found.");
        for (var i=0; i<len; i++){
            console.log("Row = " + i + " ID = " + results.rows.item(i).id + " Data =  " + results.rows.item(i));
        }
    }, errorDB);
}, errorDB);

これは行を出力しますが:

db.transaction(function(tx) {
    tx.executeSql('SELECT * FROM PREFS', [], function (tx, results) {
        var len = results.rows.length;
        console.log(len + " rows found.");
        for (var i=0; i<len; i++){
            console.log("Row = " + i + " ID = " + results.rows.item(i).id + " Data =  " + results.rows.item(i));
        }
    }, errorDB);
}, errorDB);

認証がなくても、結合クエリは設定データを見つけるべきではありませんか? 何が起きてる?

4

1 に答える 1

0

FROM句に2 つのテーブル A と B をリストすると、クロス ジョインが得られ、 A×B レコードが返されます。したがって、1 つのテーブルが空の場合、結果も空になります。

空のテーブルでもレコードを確保するには、UNION ALLを使用して別のレコードを追加し、 LIMIT 1 を使用して最初のレコードを返します。例えば、

SELECT Name, PW FROM UserData
UNION ALL
SELECT NULL, NULL
LIMIT 1

名前/パスワードを含む単一のレコード、または 2 つの NULL 値を含む単一のレコードのいずれかを返します。

それを他のテーブルと結合するには、サブクエリを使用します。

SELECT *
FROM (SELECT Name, PW FROM UserData
      UNION ALL
      SELECT NULL, NULL
      LIMIT 1),
     Prefs
于 2013-10-18T16:37:03.407 に答える