是 - 可以从空表中选择*吗?

时间:2014-02-17 19:43:12

标签: javascript sql

在我的网站上,我试图选择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。

4 个答案:

答案 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中显式使用列名,而不是使用*