sqlite / websql:单独的查询产生的结果与连接查询不同

时间:2013-10-18 15:20:00

标签: sql sqlite web-sql

我有一个非常简单的数据库,它有两个表,一个用于存储用户的auth(用户名和密码),另一个用于存储首选项。目前,当我的应用初始化时,它会先检查设置然后再进行身份验证。但我想立刻抓住它。设计应用程序的方式,两个表中只有1条记录,因此我不会在查询中使用WHERE子句。

问题是,当我单独进行查询时,它们会给出与加入它们时不同的结果。

请考虑以下情况:用户登录,设置一些设置然后注销。在may app中,这会导致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数据?这是怎么回事?

1 个答案:

答案 0 :(得分:0)

当您在FROM子句中列出两个表A和B时,会得到一个cross join,它返回A×B记录。 因此,如果一个表为空,结果也将为空。

要确保即使对于空表也有记录,请使用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