在我的网站上,我试图选择2个表 - 其中tableB可能为空,因此当tableB为空时它根本不返回任何结果。我希望我能正确解释这一点。有什么建议吗?
curatio.webdb.getAllTodoItems = function(renderFunc) {
var db = curatio.webdb.db;
db.transaction(function(tx) {
tx.executeSql("SELECT * FROM tableA, tableB", [], renderFunc,
curatio.webdb.onError);
});
}
基本上TableA具有例如Name和Surname列和TableB具有例如详细地址。但有时没有地址,然后我无法显示任何内容。
如果它是空的,我需要基本忽略tableB。
答案 0 :(得分:1)
您在那里执行的操作称为这两个表的交叉产品。交叉产品基本上是tableA的每一行,每行都是tableB。由于tableB没有行,因此交叉产品没有行。如果您想要两个表的所有行,请使用2个查询。我建议您阅读一本基本的SQL教程。
答案 1 :(得分:1)
如果tableA和tableB具有相同的模式,您可以执行以下操作:
SELECT * FROM tableA
UNION
SELECT * FROM tableB
但是,如果他们没有相同的架构,您将不得不做一些更聪明的事情来使联盟工作。
答案 2 :(得分:1)
虽然您的查询没有暗示这一点,但我仍然认为您可能正在寻找LEFT JOIN
,因为我假设您希望通过表中的列中的公共值链接来自两个表的数据B(称为外键)。
此查询选择第一个表的值,即使连接表中没有匹配的数据:
SELECT *
FROM `tableA` `a`
LEFT JOIN `tableB` `b`
ON `b`.`someReferenceColumnToTableA` = `a`.`theReferredColumn`
同样,这假设您打算按一些常用值连接两个表,例如:
person (table A):
- id
- name
phonenumber (table B):
- id
- person_id // this is the foreign key to table A that "links" the data
- phonenumber
如果您使用常规JOIN
(也称为INNER JOIN
),则只有当两个表都具有匹配数据时才返回行。
您的原始查询所做的是(隐式地)CROSS JOIN
来自两个表的所有数据。鉴于你的问题编辑,我几乎不认为这是你实际上的事情。
答案 3 :(得分:0)
curatio.webdb.getAllTodoItems = function(renderFunc) {
var db = curatio.webdb.db;
db.transaction(function(tx) {
tx.executeSql("SELECT * FROM tableA UNION ALL SELECT * FROM tableB", [], renderFunc,
curatio.webdb.onError);
});
}
最好在select中显式使用列名,而不是使用*
。