如何在SQLite子查询联接中指定列
我有以下SQL Server查询,我想将其移植到SQLite 3,但它不喜欢它,并抱怨语法错误“near”(“) 经过一些调试,问题似乎是SQLite不喜欢子查询别名后面的列说明符(我用双星号表示) 我需要做什么才能使这个查询与SQLite一起工作如何在SQLite子查询联接中指定列,sql,sqlite,Sql,Sqlite,我有以下SQL Server查询,我想将其移植到SQLite 3,但它不喜欢它,并抱怨语法错误“near”(“) 经过一些调试,问题似乎是SQLite不喜欢子查询别名后面的列说明符(我用双星号表示) 我需要做什么才能使这个查询与SQLite一起工作 SELECT rowSet.DBId_0, rowSet.TableID_0, CASE WHEN rowSet.HasIdentity_0 != rowSet.HasIdentity_1 THEN 1 E
SELECT rowSet.DBId_0,
rowSet.TableID_0,
CASE WHEN rowSet.HasIdentity_0 != rowSet.HasIdentity_1 THEN 1 ELSE 0 END 'Result'
FROM (
SELECT *
FROM
(
SELECT 'Master' AS 'Db', z.[DBId], z.[TableId], MAX(z.[MaxIdentity]) AS 'HasIdentity'
FROM
(
SELECT so.[DBId], sc.[TableId], MAX(CAST(sc.[Identity] AS TINYINT)) AS MaxIdentity
FROM syscolumns sc
JOIN sysobjects so ON sc.[tableid] = so.[id]
WHERE so.[dbid] = 1
GROUP BY so.[DBId], sc.[TableId], sc.[Identity]
) z
GROUP BY z.[DBId], z.TableId
) **src (Db_0, DBId_0, TableID_0, HasIdentity_0)**
JOIN
(
SELECT 'Target' AS 'Db', z.[DBId], z.[TableId], MAX(z.[MaxIdentity]) AS 'HasIdentity'
FROM
(
SELECT so.[DBId], sc.[TableId], MAX(CAST(sc.[Identity] AS TINYINT)) AS MaxIdentity
FROM target.syscolumns sc
JOIN target.sysobjects so ON sc.[tableid] = so.[id]
WHERE so.[dbid] = 1
GROUP BY so.[DBId], sc.[TableId], sc.[Identity]
) z
GROUP BY z.[DBId], z.TableId
) **tar (Db_1, DBId_1, TableID_1, HasIdentity_1)** ON tar.[DBId_1] = src.[DBId_0] AND tar.[TableId_1] = src.[TableId_0]
) rowSet
以下是您可以尝试的示例查询:
这项工作(在SQLite中):
这不会(在SQLite中):
重命名列的标准SQL方法是使用列别名,即:
SELECT z.col1, z.col2
FROM
(
SELECT 1 AS col1, 2 AS col2
UNION ALL
SELECT 3, 4
) AS z
您可以在子查询内为列指定别名,但在表别名中,您不能再次指定别名。在以下查询中,您可以在子查询外指定表别名,并在子查询内指定列别名:
select col1, something
from
(
select 1 as 'col1', 2 as 'something'
union
select 3, 4
) z
这是正确的,但是我希望在子查询行集中使用这些列别名,正如我提供的上一个示例所示。SQLite似乎不允许在子查询行集中指定列别名。您可以将别名应用于子查询及其列,但在标准SQL中只有一种方法可以做到这一点。为什么要这样做它不同吗?除了语法之外,还有其他区别吗?看起来SQLite不像SQL Server那样支持派生表--我必须按照您建议的方式对列进行别名。
SELECT z.col1, z.col2
FROM
(
SELECT 1 AS col1, 2 AS col2
UNION ALL
SELECT 3, 4
) AS z
select col1, something
from
(
select 1 as 'col1', 2 as 'something'
union
select 3, 4
) z