我有一个非常简单的数据库,它有两个表,一个用于存储用户的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数据?这是怎么回事?
答案 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