我有几年来的一系列DPISTAFF
表(即DPISTAFF2010_2011
)。它们每个包含近200,000条记录。我希望能够运行一个查询,从该表的每个表中返回一条记录,以便我可以比较多年的某些值。我使用UNION JOIN
来执行此操作。
目前我有以下查询:
CREATE TEMP TABLE IF NOT EXISTS _Variables (Name TEXT PRIMARY KEY, Value TEXT);
INSERT OR REPLACE INTO _Variables VALUES ('VarFirstName', 'John');
INSERT OR REPLACE INTO _Variables VALUES ('VarLastName', 'Smith');
SELECT LastName,FirstName,BirthYear,(strftime('%Y', date('now')) - BirthYear) AS Age,LocalExp,TotalExp,TotSalary,TotFringe,WorkLocationName,SchoolName
FROM DPISTAFF2008_2009
WHERE DPISTAFF2008_2009.FirstName = (SELECT Value FROM _Variables WHERE Name = 'VarFirstName')
AND DPISTAFF2008_2009.LastName = (SELECT Value FROM _Variables WHERE Name = 'VarLastName')
UNION ALL
SELECT LastName,FirstName,BirthYear,(strftime('%Y', date('now')) - BirthYear) AS Age,LocalExp,TotalExp,TotSalary,TotFringe,WorkLocationName,SchoolName
FROM DPISTAFF2009_2010
WHERE DPISTAFF2009_2010.FirstName = (SELECT Value FROM _Variables WHERE Name = 'VarFirstName')
AND DPISTAFF2009_2010.LastName = (SELECT Value FROM _Variables WHERE Name = 'VarLastName')
UNION ALL
;DROP TABLE _Variables;
变量部分工作正常。如果我只运行一个没有第二个和UNION ALL的SELECT语句,那么查询成功返回1条记录,但目前我得到near ";": syntax error:
我不知道我的语法错误是什么,但我认为这是正确的想法。
我的主要问题是区分返回的记录。我想要做的是生成一个用于查看的列,其中包含将从中返回记录的表的名称(至少数字,我只需要2010-2011
,而不是DPISTAFF
部分)。但我不想以任何方式修改表。我已经有一个名为Age
的列,它是在不修改表的情况下动态生成的。是否有可能以类似的方式获取表的名称?
答案 0 :(得分:2)
当您尝试运行完整查询时,您会收到语法错误,因为您的SELECT
语句的格式如下:
select /* stuff */
union all
select /* more stuff */
union all;
您无法像此处一样以UNION
结束查询; UNION
运算符出现在两个您希望合并其结果集的查询之间。因此,如果您只有两个表可供选择,则只需要一个UNION ALL
:
select /* stuff */
union all
select /* more stuff */;
如果您有三个表,那么您需要两个UNION ALL
s:
select /* stuff */
union all
select /* more stuff */
union all
select /* even more stuff */;
等等。至于将年份添加到结果集中,您可以将字符串文字放在SELECT
列表中并为其指定别名。因此,具有两个人员表的整体查询可能如下所示:
create temp table if not exists _Variables (Name text primary key, Value text);
insert or replace into _Variables values
('VarFirstName', 'John'),
('VarLastName', 'Smith');
select '2008-2009' as Year, T1.FirstName, T1.LastName /* more fields */
from DPISTAFF2008_2009 T1
where T1.FirstName = (select Value from _Variables where Name = 'VarFirstName' limit 1)
and T1.LastName = (select Value from _Variables where Name = 'VarLastName' limit 1)
union all
select '2009-2010' as Year, T2.FirstName, T2.LastName /*more fields */
from DPISTAFF2009_2010 T2
where T2.FirstName = (select Value from _Variables where Name = 'VarFirstName' limit 1)
and T2.LastName = (select Value from _Variables where Name = 'VarLastName' limit 1);
drop table _Variables;
输出:
sqlite> .read samplequery.sql
2008-2009|John|Smith
2009-2010|John|Smith