2013-10-18 50 views
0

我有一個非常簡單的數據庫,有兩個表,一個用於存儲用戶的身份驗證(用戶名和密碼),一個用於存儲首選項。目前,當我的應用初始化時,它首先檢查設置,然後驗證。但我想一次抓住它。應用程序的設計方式是,每個表中只有1條記錄,所以我在查詢中不使用WHERE子句。sqlite/websql:單獨的查詢產生不同的結果比加入查詢

問題是,當我單獨進行查詢時,他們會給出與加入他們不同的結果。

請考慮這種情況:用戶登錄,設置一些設置,然後註銷。在可能的應用程序這會導致驗證表被清除,但設置保持不變。

登出查詢(只是清除AUTH表)

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); 

即使沒有auth,連接查詢也不應該找到prefs數據?這裏發生了什麼?

回答

0

當您列出FROM子句中的兩個表A和B時,將得到一個返回A×B記錄的cross join。 所以如果一張桌子是空的,結果也是空的。

爲確保即使對於空表也有記錄,請使用UNION ALL添加另一條記錄,然後使用LIMIT 1返回第一條記錄。 例如,

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

將返回與該名/密碼的單個記錄,或具有兩個NULL值的單個記錄。

要加入,與其他表,使用子查詢:

SELECT * 
FROM (SELECT Name, PW FROM UserData 
     UNION ALL 
     SELECT NULL, NULL 
     LIMIT 1), 
    Prefs