使用联接表在sqlite中执行select时,带别名的列具有空值

使用联接表在sqlite中执行select时,带别名的列具有空值,sqlite,join,alias,Sqlite,Join,Alias,我试图在其中一列上使用别名连接sqlite中的两个表,但当我对该列使用别名时,它返回null 我有两张桌子,像这样: sqlite> SELECT * FROM series; _id = 1 name = Castle type = show who = dan disabled = 0 sqlite> SELECT * FROM series_meta; meta_id = 1 series_id = 1 meta_name = year

我试图在其中一列上使用别名连接sqlite中的两个表,但当我对该列使用别名时,它返回null

我有两张桌子,像这样:

sqlite> SELECT * FROM series;
     _id = 1
    name = Castle
    type = show
     who = dan
disabled = 0

sqlite> SELECT * FROM series_meta;
  meta_id = 1
series_id = 1
meta_name = year
meta_type = int
meta_text =
 meta_int = 2009
现在,我尝试以下查询:
SELECT _id、name、type、who、disabled、y.meta\u int AS year FROM series LEFT JOIN series\u meta AS y ON _id=y.series\u id和y.meta\u name=“year”我得到:

     _id = 1
    name = Castle
    type = show
     who = dan
disabled = 0
    year =
但是如果我去掉列别名(
SELECT _id、name、type、who、disabled、y.meta\u int FROM series LEFT JOIN series\u meta AS y ON _id=y.series\u id和y.meta\u name=“year”
),我会得到预期的结果:

     _id = 1
    name = Castle
    type = show
     who = dan
disabled = 0
meta_int = 2009
我已经在Windows7上用sqlite 3.8.8.2尝试过了。我还使用python进行了尝试,得到了完全相同的结果。删除表别名也不会改变任何内容


没有办法让它与列别名一起工作吗?

当然,您可以使用任意多的列别名,但实际上您在这里遇到了一个不同的问题,这就是使用
year
作为字段名

如果y.meta_int被命名为
year
,则结果将为
(null)
,而任何其他名称将起作用:

SELECT _id, name, type, who, disabled, y.meta_int tyear
FROM series
LEFT JOIN series_meta AS y ON _id=y.series_id AND y.meta_name="year";
SELECT _id, name, type, who, disabled, y.meta_int AS m_year
FROM series, series_meta AS y
WHERE _id=y.series_id AND y.meta_name="year";
同样的结果没有连接,但是在这里。但不同的是,在这里,如果您使用'year'作为字段名,实际上根本不会得到任何结果。任何其他名称都适用:

SELECT _id, name, type, who, disabled, y.meta_int tyear
FROM series
LEFT JOIN series_meta AS y ON _id=y.series_id AND y.meta_name="year";
SELECT _id, name, type, who, disabled, y.meta_int AS m_year
FROM series, series_meta AS y
WHERE _id=y.series_id AND y.meta_name="year";

希望这有帮助

在SQL中,单引号用于字符串,双引号用于引用列名。 因此
y.meta\u name=“year”
y.meta\u name
列的内容与
y.meta\u int
列的内容进行比较

为了与MySQL等有缺陷的数据库兼容,SQLite还支持对带引号的列名使用单引号,对字符串使用双引号,但只有在区别明确时才支持。 应始终使用正确的SQL语法:

SELECT _id, name, type, who, disabled, y.meta_int AS year
FROM series
LEFT JOIN series_meta AS y ON _id=y.series_id
                          AND y.meta_name = 'year'